第一归属:CSV(Comma-Separated Values)
csv 是 Python 内置的标准库,它解决了手动处理 CSV 时的诸多坑(比如字段包含逗号、换行符、引号等特殊情况),无需额外安装,是处理表格类文本数据的首选工具,专门用于处理 CSV(逗号分隔值)格式的文件
一、核心功能与基础用法
读取 CSV 文件
csv 库提供 csv.reader() 和 csv.DictReader() 两种读取方式,后者更易用(按列名取值)
示例 1:基础读取(csv.reader)
python
import csv
# 读取 CSV 文件(假设 test.csv 内容如下)
# 姓名,年龄,城市
# 张三,25,北京
# 李四,30,上海
# 王五,28,广州
# 方式1:csv.reader(返回列表形式的行)
with open('test.csv', 'r', encoding='utf-8') as f:
# 创建 reader 对象
reader = csv.reader(f)
# 获取表头(第一行)
header = next(reader)
print("表头:", header) # 输出:表头: ['姓名', '年龄', '城市']
# 遍历每一行数据
for row in reader:
# row 是列表,通过索引取值
name = row[0]
age = row[1]
city = row[2]
print(f"姓名:{name},年龄:{age},城市:{city}")
示例 2:字典形式读取(csv.DictReader,推荐)
python
import csv
with open('test.csv', 'r', encoding='utf-8') as f:
# 创建 DictReader 对象,自动将第一行作为键
reader = csv.DictReader(f)
# 遍历每一行(行是字典,按列名取值)
for row in reader:
name = row['姓名']
age = row['年龄']
city = row['城市']
print(f"姓名:{name},年龄:{age},城市:{city}")
写入 CSV 文件
对应有 csv.writer() 和 csv.DictWriter() 两种写入方式
示例 1:基础写入(csv.writer)
python
import csv
# 要写入的数据
data = [
['姓名', '年龄', '城市'],
['赵六', 32, '深圳'],
['孙七', 27, '杭州']
]
# 写入 CSV 文件(newline='' 避免每行多空行)
with open('output.csv', 'w', encoding='utf-8', newline='') as f:
# 创建 writer 对象
writer = csv.writer(f)
# 写入单行(表头)
writer.writerow(data[0])
# 写入多行(数据)
writer.writerows(data[1:])
示例 2:字典形式写入(csv.DictWriter,推荐)
python
import csv
# 表头(键名)
fieldnames = ['姓名', '年龄', '城市']
# 要写入的数据(字典列表)
data = [
{'姓名': '周八', '年龄': 29, '城市': '成都'},
{'姓名': '吴九', '年龄': 31, '城市': '重庆'}
]
with open('output_dict.csv', 'w', encoding='utf-8', newline='') as f:
# 创建 DictWriter 对象,指定表头
writer = csv.DictWriter(f, fieldnames=fieldnames)
# 先写入表头
writer.writeheader()
# 写入多行数据
writer.writerows(data)
二、进阶用法:处理特殊场景
自定义分隔符(如制表符 \t、分号;)
CSV 不一定用逗号分隔,比如欧洲常用分号,可通过 delimiter 参数指定
python
import csv
# 读取分号分隔的 CSV
with open('semicolon.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f, delimiter=';')
for row in reader:
print(row)
# 写入制表符分隔的 CSV
with open('tab_sep.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f, delimiter='\t')
writer.writerow(['姓名', '年龄', '城市'])
writer.writerow(['郑十', 26, '南京'])
处理带引号的字段
CSV 中如果字段包含逗号 / 换行符,会用引号包裹,csv 库会自动处理
python
import csv
# 写入带特殊字符的字段
data = [
['姓名', '描述'],
['钱十一', '爱好:读书,跑步\n职业:程序员'] # 包含逗号和换行符
]
with open('quote_test.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f, quoting=csv.QUOTE_ALL) # 所有字段加引号
writer.writerows(data)
# 读取验证(自动解析引号内的特殊字符)
with open('quote_test.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row[1]) # 输出完整的描述,包含逗号和换行符
quoting 参数可选值:
csv.QUOTE_ALL:所有字段加引号csv.QUOTE_MINIMAL:仅特殊字段(含分隔符 / 换行符)加引号(默认)csv.QUOTE_NONNUMERIC:非数字字段加引号csv.QUOTE_NONE:不加引号
读取 / 写入时转换数据类型
csv 读取的所有字段默认是字符串,可手动转换
python
import csv
with open('test.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
# 将年龄从字符串转为整数
age = int(row['年龄'])
print(f"{row['姓名']} 的年龄是 {age}(类型:{type(age)})")
三、常见坑与注意事项
- 编码问题 :中文 CSV 建议用
encoding='utf-8',如果读取乱码,可尝试gbk/gb2312(Windows 生成的 CSV 常用) - newline='' :写入时必须加
newline='',否则 Windows 系统下每行之间会多出一个空行 - 空值处理 :
csv库读取空字段会返回空字符串'',需自行判断处理(比如转为None) - 大文件处理 :
csv库是逐行读取 / 写入,内存占用低,适合处理大 CSV 文件(无需一次性加载全部数据)
总结
csv是 Python 内置库,无需安装,专门处理 CSV 文件,能自动处理特殊字符(逗号、引号、换行符)- 核心用法分两类:
reader/writer(列表形式)和DictReader/DictWriter(字典形式,推荐,按列名取值更直观) - 关键参数:
delimiter自定义分隔符、quoting控制引号规则、写入时加newline=''避免空行,中文文件指定encoding='utf-8'或gbk