CSV文件简介
CSV(Comma-Separated Values,逗号分隔值),是一种纯文本形式存储表格数据的文件。该文件由任意数目的记录组成,每条记录被分隔符分隔为字段(最常见的分隔符是逗号或制表符),且每条记录都有相同的字段序列,因此csv相当于一个结构化表的纯文本形式。从直观上看,它比Excel文件更加简洁,然而它不包含诸如XLS电子表格的数值、公式和格式等内容,它仅仅为一个结构化的纯文本。
CSV文件读取和写入
在CSV文件读写操作中,常用两种读写方式是列表读写和字典读写,下面我们分别来对此进行介绍。
文件读取
csv文件读取主要是使用reader()和DictReader()方法,二者均接收一个csv文件参数,并返回一个用于文件读取迭代器。这两个方法的区别是:reader()方法获取的是一行行列表数据的迭代器,每行的数据可通过下标来获取,而DictReader()方法获取的是一行行字典数据的迭代器,每行的数据可通过键来获取。
##CSV文件读取的两种方式
import csv
# 列表读取
with open('data.csv', 'r') as fp:
reader = csv.reader(fp) #返回读取迭代器
titles = next(reader) #提取出文件记录标题
print(type(titles)) #<class 'list'>
print(titles) #['id', 'name', 'city']
for x in reader: #遍历向下迭代
print(x) #['001', 'Mike', 'Beijing']...
id = x[0]
name = x[1]
city = x[2]
print({'id': id, 'name': name, 'city': city}) #{'id': '001', 'name': 'Mike', 'city': 'Beijing'}
# 字典读取
with open('data.csv', 'r') as fp:
reader = csv.DictReader(fp) #迭代器,但不包含标题数据(第0行)
for x in reader:
print(type(x)) #<class 'collections.OrderedDict'>
print(x) #OrderedDict([('id', '001'), ('name', 'Mike'), ('city', 'Beijing')])...
id = x['id']
name = x['name']
city = x['city']
print({'id': id, 'name': name, 'city': city}) #{'id': '001', 'name': 'Mike', 'city': 'Beijing'}
文件写入
同文件读取一样,文件的写入也有两种方法——writer()和DictWriter(),其含义和reader()/DictReader()相类似,writer()用于列表数据写入,而DictWriter()用于字典数据写入。二者使用方法也比较简单,但需要注意的是由于是写入文件,需要指明文件的编码方式(特别是需要写入中文字符时),具体的用法如下所示。
##CSV文件写入的两种方式
import csv
# 列表写入
# 设置记录标题(列表)和记录值(一个嵌套元组集或列表集的列表)
headers = ['id','name','province']
values = [
('001','ShenZhen','GuangDong'),
('002', 'WuHan', 'HuBei'),
('003', 'ChengDu', 'SiChuan')
]
# 使用open函数时设置参数encoding以防止乱码
with open('citylist.csv','w',encoding='utf-8',newline='') as fp:
writer = csv.writer(fp) #获取文件
writer.writerow(headers) #写入一行记录
writer.writerows(values) #写入多行记录,传入的参数为列表结构
# 字典写入
# 设置记录标题(列表)和记录值(一个嵌套字典集的列表)
headers = ['id', 'name', 'province']
values = [
{'id': '001', 'name': 'ShenZhen', 'province': 'GuangDong'},
{'id': '002', 'name': 'WuHan', 'province': 'HuBei'},
{'id': '003', 'name': 'ChengDu', 'province': 'SiChuan'}
]
with open('citydict.csv', 'w', encoding='utf-8', newline='') as fp:
writer = csv.DictWriter(fp,headers) #获取文件,注意参数还需传递记录标题以映射,注意此时并不会真正写入标题
writer.writeheader() #写入记录标题
writer.writerows(values) #写入多行记录
在打开待写入CSV文件时,这里我们还传入了一个newline参数,并且其值为空字符串,这么做是为了防止在每次写完一行后其会自动再写入一个换行符,如下图为设置和不设置newline的文件写入对应结果:
设置了newline的文件写入结果:
“””
id,name,province
001,ShenZhen,GuangDong
002,WuHan,HuBei
003,ChengDu,SiChuan
“””
未设置newline的文件写入结果:
“””
id,name,province
001,ShenZhen,GuangDong
002,WuHan,HuBei
003,ChengDu,SiChuan
“””