Python csv标准库 --csv格式文件读写

csv 文件可以理解为简易版EXcel,是存储数据常用的格式之一,csv 模块用于读写csv格式的文件

csv格式

csv 是一种字符串文件的格式,它组织数据的语法就是在字符串之间加分隔符,即

行与行之间是加换行符
同行字符之间是加英文逗号分隔

csv 文件可以使用任意的文本编辑器(如记事本)或者Excel打开,Excel可以把文件另存为csv格式(因为Excel支持csv格式文件)
用csv格式存储数据,读写比较方便,易于实现,文件也会比Excel文件小
但csv文件缺少Excel文件本身的很多功能,比如不能嵌入图像和图表,不能生成公式
csv 是一个标准模块,不需额外安装
csv 模块读取csv文件的方式有函数 reader() 和类 DictReader ,写入csv文件的方式有函数 writer() 和类 DictWriter 两种

一、写入csv文件

writer()函数写入

函数 writer() 有两个写入方法

写入一行: writer.writerow(row)
写入多行: writer.writerows(rows)

row 必须是可迭代对象,推荐使用列表[]

rows 必须是可迭代对象,推荐使用大列表[[],[],..[]]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import csv

# 文件路径,与py文件在同一个目录下
path = './aaaa.csv'
# 如果 aaaa.csv 文件不存在则自动创建
# open(文件路径 w写入模式 避免空行 编码格式)
with open(path, 'w', newline='', encoding='utf-8') as f:
# 实例化writer对象并赋值给writer
writer = csv.writer(f)
# writerow 方法写入一行数据
writer.writerow(['姓名','省份'])
# writerows 方法传入多个列表,每个列表对应一行
writer.writerows([
['小明', '河南'],
['小红', '山东'],
['小刚', '江苏'],
['小军', '安徽']
])

39

DictWriter类写入

DictWriter 类将 字典 类型的数据写入csv文件的 中,即 DictWriter 类写入的数据类型必须是 字典

如果需要将 字典 类型的数据写入到csv文件中时,使用 DictWriter 类处理是一种更好的选择

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import csv

row_dict = {'姓名': '小明', '性别': '男', '省份': '河南'}
rows_dict = [
{'姓名': '小刚', '性别': '男', '省份': '湖北'},
{'姓名': '小军', '性别': '男', '省份': '山东'},
{'姓名': '小红', '性别': '女', '省份': '江苏'}
]

# 根据row_dict和rows_dict字典中的键写入对应的表头
headers = ['姓名', '性别', '省份']

# 文件路径,与py文件在同一个目录下
path = './bbbb.csv'
# 如果 bbbb.csv 文件不存在则自动创建
# open(文件路径 w写入模式 避免空行 编码格式)
with open(path, 'w', newline='', encoding='utf-8') as f:
# 实例化DictWriter对象并赋值给dict_Writer,将表头headers赋值给fieldnames
dict_Writer = csv.DictWriter(f, fieldnames=headers)
# 写入表头
dict_Writer.writeheader()
# 写入一行数据
dict_Writer.writerow(row_dict)
# 写入多行数据
dict_Writer.writerows(rows_dict)

40

二、读取csv文件

reader()函数读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import csv

# 文件路径,与py文件在同一个目录下
path = './aaaa.csv'
# open(文件路径 r读取模式 避免空行 编码格式)
with open(path, 'r', newline='', encoding='utf-8') as f:
# 实例化redear对象并赋值给reader
reader = csv.reader(f)
# 遍历reader对象,该对象的每一个元素是列表
for i in reader:
# 打印数据
print(i)

'''输出
['姓名', '省份']
['小明', '河南']
['小红', '山东']
['小刚', '江苏']
['小军', '安徽']
'''

DictReader类读取

DictReader 类读取第一行有表头的csv文件,可以更好地反映出表头与文件内容的映射关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import csv

# 文件路径,与py文件在同一个目录下
path = './bbbb.csv'
# open(文件路径 r读取模式 避免空行 编码格式)
with open(path, 'r', newline='', encoding='utf-8') as f:
# 实例化DictReader对象并赋值给dict_reader
dict_reader = csv.DictReader(f)
# 通过fieldnames属性获取表头
header = dict_reader.fieldnames
# 打印表头,以列表形式返回
print(header)
# 遍历DictReader,该对象的每一个元素是字典
for dict in dict_reader:
# 打印数据
print(dict)
# 打印字典中的值
print(dict['姓名'], dict['省份'])

'''输出
['姓名', '性别', '省份']
{'姓名': '小明', '性别': '男', '省份': '河南'}
小明 男 河南
{'姓名': '小刚', '性别': '男', '省份': '湖北'}
小刚 男 湖北
{'姓名': '小军', '性别': '男', '省份': '山东'}
小军 男 山东
{'姓名': '小红', '性别': '女', '省份': '江苏'}
小红 女 江苏
'''

每一个字典的 对应csv文件中的表头, 对应每一行数据

提取字典中的 的方法 dict[键]

文件模式

r: 读取模式
w: 写入模式,该模式会清除原有数据后重新写入
a: 追加模式,在原有数据上写入

这三种模式适用于读写 文本

图片、音频是使用二进制格式保存的,那么在读取它们时至少使用 rbwbab 模式

38

来源

官方英文教程

中文教程