csv是一种我们常见的数据处理格式,官方叫逗号分隔值文件格式,其文件以纯文本形式存储表格数据(数字和文本),即必须是字符序列;csv格式文件非常简洁,文件的每一行内容代表Excel表格中一行,逗号分隔了该行中的单元格内容(分隔符也可以不是逗号),但是它没有Excel的宽高设置,没有颜色字体等等的设置,非常适合数据的存储和处理,比如我们可以将爬取的数据用csv的格式存储起来,读取和写入也非常的方便;
import csv # 导入csv库,这是一个自带库,不需要安装哈
# 创建一个列表,这就是我们需要存储的数据
data = [
['0', '3', '6', '9', '12', '15', '18'],
['0', '4', '8', '12', '16'],
['0', '5', '10', '15'],
['0', '6', '12', '18'],
['0', '7', '14'],
['0', '8', '16'],
['0', '9', '18']
]
with open('test.csv','w') as f: # 文件操作,打开文件,退出即保存
writer = csv.writer(f) # 实例化对象,相当于把刚才打开的文件赋予了csv写入的属性
writer.writerows(data) # 将数据写入文件
with open('test.csv','r') as f: # 打开文件
reader = csv.reader(f) # 将打开的文件数据以csv格式读入
for row in reader: # 遍历返回的数据,将其打印出来
print(row)
# 输出结果:
# ['0', '3', '6', '9', '12', '15', '18']
# []
# ['0', '4', '8', '12', '16']
# []
# ['0', '5', '10', '15']
# []
# ['0', '6', '12', '18']
# []
# ['0', '7', '14']
# []
# ['0', '8', '16']
# []
# ['0', '9', '18']
# []
通过上面的例程,我们来分析一下:
- 在创建数据的时候使用的是列表,那么写入数据必须是列表格式吗?
官方给出的是:必须是支持迭代的对象,可以是文件(file)对象或者列表(list)对象,如果我们需要保存一个'12',我们看看会出现什么情况import csv with open('test.csv','w') as f: writer = csv.writer(f) writer.writerows('12') with open('test.csv','r') as f: reader = csv.reader(f) for row in reader: print(row) # ['1'] # [] # ['2'] # []
会发现将'12'分开存储了,这是因为字符串也是序列,可以将它理解成一个变形的列表;我们回过来,整个列表就像是一张纸,里面的第一个列表元素就是第一行的内容,再往里面第一个列表元素的第一个元素就是第一行第一列的值了,我们后面保存数据一般就是以列表的形式进行存储;
上面说了,支持迭代的对象,就是说元组、字典也是可以的,还可以是文件对象; - 我们会发现每一行后面会有一个空行,这是库方法自带加的,就像print('hi',end='\n')是一样的道理,那么有没有什么办法去除呢?
import csv with open('test.csv','w',newline='') as f: # 我们可以在打开文件的时候设置newline='',新的一行就不会有空行了 writer = csv.writer(f) writer.writerows('12') with open('test.csv','r') as f: reader = csv.reader(f) for row in reader: print(row) # ['1'] # ['2']
- 我们将读入的文件输出的时候,发现他是以列表格式返回的,就像我们最开始写入的格式一样;
我们上面读写的都是简单的文本,且编码格式是已知的,当我们爬取数据的时候,数据的编码格式就不是那么确定了,这样就会造成兼容的问题,那么这个问题要怎么解决呢?
import csv
data = [
[u'啊啊啊','dsfad'],
[u'不不不','gdgdd']
]
with open('test.csv','w',newline='',encoding='utf-8-sig') as f: #读写的时候都指定编码格式,确保兼容性
writer = csv.writer(f)
writer.writerows(data)
with open('test.csv','r',encoding='utf-8-sig') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# ['啊啊啊', 'dsfad']
# ['不不不', 'gdgdd']
上面说了,分隔符也可以不是逗号,那么我想将分隔符改成 | 该怎么办呢?
import csv
data = [
[u'啊啊啊','dsfad'],
[u'不不不','gdgdd']
]
with open('test.csv','w',newline='',encoding='utf-8-sig') as f:
writer = csv.writer(f,delimiter='|') # 我们可以在创建对象的时候,修改delimiter这个属性
writer.writerows(data)
with open('test.csv','r',encoding='utf-8-sig') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# ['啊啊啊|dsfad']
# ['不不不|gdgdd']