Python CSV 模块使用教程
CSV(Comma Separated Values)格式是用于数据存储的一种简单、广泛使用的文件格式,尤其常见于电子表格、数据库和数据分析中。Python 提供了一个 csv
模块,可以方便地处理 CSV 文件的读写操作。无论是读取、写入简单的文本数据,还是处理复杂的 CSV 格式,csv
模块都能够提供强大的支持。
本文将介绍如何使用 Python 的 csv
模块进行 CSV 文件的读写操作,包括基本操作、格式化以及更高级的应用。
# 导入 Python csv 模块
import csv
1. csv.reader
- 读取 CSV 文件
示例数据(read.csv):
name,age,city
张珊,19,北京
李思,20,上海
王武,21,广州
赵柳,22,深圳
Python 代码:
# 打开 CSV 文件并使用 csv.reader 读取
with open('read.csv', mode='r', encoding='utf-8') as file:
csv_reader = csv.reader(file) # 创建 reader 对象
for row in csv_reader:
print(row)
输出结果:
['name', 'age', 'city']
['张珊', '19', '北京']
['李思', '20', '上海']
['王武', '21', '广州']
['赵柳', '22', '深圳']
2. csv.writer
- 写入 CSV 文件
Python 代码:
data = [
['Name', 'Age', 'Sex'],
['熊大', 20, '男'],
['熊二', 18, '男'],
]
# 创建 CSV 文件并写入数据
with open('writer.csv', 'w', newline='', encoding='utf-8') as csvfile:
csv_writer = csv.writer(csvfile) # 创建 writer 对象
csv_writer.writerows(data) # 写入数据
生成文件(writer.csv):
Name,Age,Sex
熊大,20,男
熊二,18,男
3. csv.register_dialect
- 注册 CSV 方言
Python 代码:
# 注册一个自定义的CSV方言
csv.register_dialect(
'custom_dialect', # 命名所注册的自定义方言
delimiter=';', # 设置字段之间的分隔符为分号
quotechar='"', # 设置引用字符为双引号
quoting=csv.QUOTE_MINIMAL # 设置引用方式为最小化引用,只在必要时引用字段
)
data = [
['Name', 'Age', 'Sex'],
['熊大', 20, '男'],
['熊二', 18, '男'],
]
# 使用新注册的变种写入 CSV
with open('dialect.csv', 'w', newline='', encoding='utf-8') as csvfile:
# 创建一个CSV写入器,使用之前注册的自定义方言
csv_writer = csv.writer(csvfile, dialect='custom_dialect')
csv_writer.writerows(data) # 写入数据
生成文件(dialect.csv):
Name;Age;Sex
熊大;20;男
熊二;18;男
4. csv.unregister_dialect
- 取消注册 CSV 方言
Python 代码:
# 取消已注册的变种 custom_dialect
csv.unregister_dialect('custom_dialect')
5. csv.get_dialect
- 获取已注册的方言
Python 代码:
# 获取并打印某个变种的详细信息
dialect = csv.get_dialect('custom_dialect')
print(f"分隔符: {dialect.delimiter}\n引号字符: {dialect.quotechar}")
输出结果:
分隔符: ;
引号字符: "
6. csv.list_dialects
- 列出所有注册的方言
Python 代码:
# 获取所有可用的 CSV 变种
print(csv.list_dialects())
输出结果:
['excel', 'excel-tab', 'unix', 'custom', 'custom_dialect']
7. csv.field_size_limit
- 设置/获取最大字段大小
Python 代码:
# 获取当前的字段大小限制
print("默认最大字段大小:", csv.field_size_limit())
# 修改字段大小限制
csv.field_size_limit(100000)
print("新设置的最大字段大小:", csv.field_size_limit())
输出结果:
默认最大字段大小: 131072
新设置的最大字段大小: 100000
8. csv.DictReader
- 以字典形式读取 CSV 文件
示例数据(read.csv):
name,age,city
张珊,19,北京
李思,20,上海
王武,21,广州
赵柳,22,深圳
Python 代码:
# 读取 CSV 并以字典格式解析
with open('read.csv', newline='', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row)
输出结果:
{'name': '张珊', 'age': '19', 'city': '北京'}
{'name': '李思', 'age': '20', 'city': '上海'}
{'name': '王武', 'age': '21', 'city': '广州'}
{'name': '赵柳', 'age': '22', 'city': '深圳'}
9. csv.DictWriter
- 以字典形式写入 CSV 文件
Python 代码:
# 定义字段名和数据
data = [
{'name': '汤姆', 'type': '猫', 'colour': 'blue'},
{'name': '杰瑞', 'type': '鼠', 'colour': 'yellow'}
]
# 写入 CSV 文件
with open('dict_writer.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['name', 'type', 'colour']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# 写入表头
writer.writeheader()
# 循环写入数据
for row in data:
writer.writerow(row)
生成文件(dict_writer.csv):
name,type,colour
汤姆,猫,blue
杰瑞,鼠,yellow
10. csv.Dialect
- 定义CSV文件格式
Python 代码:
# 自定义方言
class MyDialect(csv.Dialect):
delimiter = '|' # 分隔符为竖线
quotechar = '"' # 引号字符为双引号
doublequote = True # 双引号转义
lineterminator = '\n' # 行终止符为换行符
quoting = csv.QUOTE_MINIMAL # 引用风格为最小化引用
csv.register_dialect('my_dialect', MyDialect) # 将自定义的 CSV 方言注册为 'my_dialect'
data = [
['Name', 'Age', 'Sex'],
['熊大', 20, '男'],
['熊二', 18, '男'],
]
# 打开文件进行写入
with open('my_dialect.csv', 'w', newline='', encoding='utf-8') as csvfile:
# 创建一个CSV写入器,使用之前注册的自定义方言
csv_writer = csv.writer(csvfile, dialect='custom_dialect')
csv_writer.writerows(data) # 写入数据
生成文件(my_dialect.csv):
Name;Age;Sex
熊大;20;男
熊二;18;男
11. csv.Sniffer
- 自动检测 CSV 格式
示例数据(read.csv):
name,age,city
张珊,19,北京
李思,20,上海
王武,21,广州
赵柳,22,深圳
Python 代码:
with open('read.csv', newline='', encoding='utf-8') as csvfile:
sample = csvfile.read(1024) # 读取部分内容进行分析
sniffer = csv.Sniffer()
dialect = sniffer.sniff(sample)
print(f"检测到的分隔符: {dialect.delimiter}")
输出结果:
检测到的分隔符: ,