CSV,全称为Comma-Separated Values,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分隔。每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。不过所有记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。它比Excel文件更加简介,XLS文本是电子表格,它包含了文本、数值、公式和格式等内容,而CSV中不包含这些内容,就是特定字符分隔的纯文本,结构简单清晰。所以,有时候用CSV来保存数据是比较方便的。【引自崔庆才的《python3网络爬虫开发实战》】
我在使用爬虫进行数据 存储的时候,若不使用数据库,则更多的会选择csv。
现有test.csv,内容如下:
学号 | 姓名 | 性别 | 年龄 |
---|---|---|---|
1 | 小明 | 男 | 11 |
2 | 小花 | 女 | 12 |
3 | 小李 | 男 | 13 |
一.读
import csv
with open('test.csv', 'r', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)
运行结果:
['学号', '姓名', '性别', '年龄']
['1', '小明', '男', '11']
['2', '小花', '女', '12']
['3', '小李', '男', '13']
- 这里的
encoding
视文件的具体编码格式决定,不一定是utf-8; - 上面的reader为可迭代对象,也是迭代器,故若不要第一行列索引,可直接在for前面进行
next(reader)
,迭代一次,从而没有第一行数据; - 可用
isinstance()
判断一个对象是否为某种类型,如下:
from collections import Iterable, Iterator
isinstance(对象, Iterable)
isinstance(对象, Iterator)
二.写
1.列表
将数据写入形成如上的test.csv
import csv
with open('test.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['学号', '姓名', '性别', '年龄'])
writer.writerow(['1', '小明', '男', '11'])
writer.writerow(['2', '小花', '女', '12'])
writer.writerow(['3', '小李', '男', '13'])
或使用writerows
,很明显writerow为一行一行地写入,writerows为多行一起写入:
import csv
row1 = ['学号', '姓名', '性别', '年龄']
row2 = ['1', '小明', '男', '11']
row3 = ['2', '小花', '女', '12']
row4 = ['3', '小李', '男', '13']
with open('test.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerows([row1, row2, row3, row4])
若csv文件出现隔行的情况,则需要加入参数newline=''
2.字典
import csv
headers = ['学号', '姓名', '性别', '年龄']
rows = [
{'学号':1,'姓名':'小明','性别':'男','年龄':11},
{'学号':2,'姓名':'小花','性别':'女','年龄':12},
{'学号':3,'姓名':'小李','性别':'男','年龄':13},
]
with open('test.csv','w',newline='') as csvfile:
writer= csv.DictWriter(csvfile,headers)
writer.writeheader()
writer.writerows(rows)
- 写入csv中的数据可以为字符串也可以为其他数据类型,但读的时候会都转为字符串;
- 若写入方式为
'a'
追加,则可以把writer.writeheader()
去掉,否则会再次写入列索引,但无论w还是a,列索引headers 还是要定义的...
二.特别注意
csv说白了就是文本文件,所以不存在多个sheet的问题
【持续更新中,错误请指出,谢谢!!!】