Python 模块 csv

模块csv使用

一、读取 CSV 文件

1.1 使用 csv.reader()

1
2
3
4
5
with open('example.csv', newline='', encoding='utf-8', delimiter=',') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)

常用参数
参数 说明
delimiter 指定分隔符,默认为逗号,
quotechar 指定引号字符,默认为双引号””
skipinitialspace 是否跳过分隔符后多余空格
1
csv.reader(csvfile, delimiter=';', quotechar='"', skipinitialspace=True)

1.2 使用 csv.DictReader()

以字典形式读取,首行自动作为 key。

1
2
3
4
with open('example.csv', newline='', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['name'], row['age'])

常用参数

参数 说明
fieldnames 指定字段名(可用于无表头的CSV)

二、写入 CSV 文件

2.1 使用 csv.writer()

1
2
3
4
5
6
7
8
9
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['name', 'age', 'gender']) # 写入表头
writer.writerow(['Alice', 25, 'F']) # 写入一行
writer.writerows([
['Bob', 30, 'M'],
['Charlie', 35, 'M']
])

常用参数

方法 说明
writerow(row) 写入一行数据
writerows(rows) 写入多行数据

2.2 使用 csv.DictWriter()

以字典形式写入,推荐用于字段较多或数据为字典结构时。

1
2
3
4
5
6
7
8
9
10
11
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['name', 'age', 'gender']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

writer.writeheader() # 写入表头
writer.writerow({'name': 'Alice', 'age': 25, 'gender': 'F'})
writer.writerows([
{'name': 'Bob', 'age': 30, 'gender': 'M'},
{'name': 'Charlie', 'age': 35, 'gender': 'M'}
])

常用参数

方法 说明
writeheader() 写入表头
writerow(dict) 写入一行数据
writerows(dicts) 写入多行数据

三、处理换行符问题(Windows注意)

使用 newline=’’ 打开文件是推荐方式,防止出现空行。

1
2
3
with open('file.csv', 'w', newline='', encoding='utf-8') as f:
...

四、特殊情况处理

4.1 自定义分隔符和引号

1
csv.writer(f, delimiter=';', quotechar="'", quoting=csv.QUOTE_MINIMAL)

quoting 参数选项:

说明
csv.QUOTE_ALL 所有字段都加引号
csv.QUOTE_MINIMAL 只在需要时加引号(默认)
csv.QUOTE_NONNUMERIC 非数字字段加引号
csv.QUOTE_NONE 不添加引号

五、完整案例

5.1 从 CSV 读取再写入新文件

1
2
3
4
5
6
7
8
9
10
11
12
13
import csv

with open('input.csv', newline='', encoding='utf-8') as infile, \
open('output.csv', 'w', newline='', encoding='utf-8') as outfile:

reader = csv.DictReader(infile)
fieldnames = reader.fieldnames
writer = csv.DictWriter(outfile, fieldnames=fieldnames)

writer.writeheader()
for row in reader:
# 可以对数据进行处理
writer.writerow(row)