csv
模块是 Python 标准库中用于处理 CSV (Comma-Separated Values) 文件的模块,它提供了读取和写入 CSV 文件的功能。
目录
CSV 文件基本概念
CSV 文件是以纯文本形式存储表格数据(数字和文本)的文件格式,其特点:
-
每条记录占一行
-
字段间用逗号分隔(也可以是其他分隔符)
-
字段内容包含逗号或换行符时需要用引号括起来
主要功能
1. 读取 CSV 文件
csv.reader
方法
import csv
with open('data.csv', 'r', newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row) # 每行作为一个列表返回
参数说明:
-
delimiter
: 指定分隔符,默认为','
-
quotechar
: 指定引用符,默认为'"'
-
quoting
: 引用规则,可选值:-
csv.QUOTE_MINIMAL
: 只在必要时引用(默认) -
csv.QUOTE_ALL
: 全部引用 -
csv.QUOTE_NONNUMERIC
: 非数字字段引用 -
csv.QUOTE_NONE
: 不引用
-
示例:自定义分隔符
with open('data.tsv', 'r', newline='') as f:
reader = csv.reader(f, delimiter='\t') # 处理制表符分隔的文件
for row in reader:
print(row)
2. 写入 CSV 文件
csv.writer
方法
import csv
data = [
['Name', 'Age', 'City'],
['Alice', '25', 'New York'],
['Bob', '30', 'London'],
['Charlie', '35', 'Paris']
]
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(data) # 写入多行
写入单行
with open('output.csv', 'a', newline='') as f: # 'a' 表示追加模式
writer = csv.writer(f)
writer.writerow(['David', '40', 'Tokyo']) # 写入单行
3. 使用字典方式读写(推荐)
csv.DictReader
- 读取为字典
with open('data.csv', 'r') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['Name'], row['Age']) # 通过列名访问数据
csv.DictWriter
- 从字典写入
fieldnames = ['Name', 'Age', 'City']
data = [
{'Name': 'Alice', 'Age': '25', 'City': 'New York'},
{'Name': 'Bob', 'Age': '30', 'City': 'London'}
]
with open('output.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # 写入标题行
writer.writerows(data) # 写入多行数据
高级用法
1. 处理不同方言的 CSV 文件
csv.register_dialect('unix', delimiter=':', quoting=csv.QUOTE_NONE)
with open('data.unix', 'r') as f:
reader = csv.reader(f, dialect='unix')
for row in reader:
print(row)
2. 处理包含 Unicode 字符的文件
with open('unicode.csv', 'r', encoding='utf-8-sig') as f: # utf-8-sig 处理BOM
reader = csv.reader(f)
for row in reader:
print(row)
3. 自定义转换器
def parse_percent(value):
return float(value.strip('%')) / 100
with open('data.csv', 'r') as f:
reader = csv.reader(f)
next(reader) # 跳过标题行
for row in reader:
value = parse_percent(row[1])
print(f"原始值: {row[1]}, 转换后: {value}")
注意事项
-
newline=''
参数:在打开 CSV 文件时建议设置,避免在 Windows 上出现空行问题 -
编码问题:处理非 ASCII 字符时明确指定编码(通常用
utf-8
) -
大文件处理:对于大 CSV 文件,考虑逐行处理而非一次性读取全部内容
-
安全性:处理来自不可信源的 CSV 文件时要小心,可能包含恶意内容
实际应用示例
示例1:计算 CSV 文件中数值列的平均值
import csv
total = 0
count = 0
with open('grades.csv', 'r') as f:
reader = csv.DictReader(f)
for row in reader:
total += float(row['Score'])
count += 1
print(f"平均分: {total/count:.2f}")
示例2:过滤并保存符合条件的记录
import csv
with open('input.csv', 'r') as infile, open('output.csv', 'w', newline='') as outfile:
reader = csv.DictReader(infile)
writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
if int(row['Age']) > 30:
writer.writerow(row)
csv
模块是 Python 中处理 CSV 文件的强大工具,掌握它可以高效地进行数据导入导出操作。