本文目录导读:
读写CSV(逗号分隔值)文件是数据处理中最常见的操作之一,Python提供了内置的csv模块,能很好地处理常见的CSV格式(包括带引号、含逗号的数据等)。
下面是几种常见的读写方式,包括基础操作和常用技巧。
使用 csv 模块(推荐,稳定性高)
读取CSV文件
方法A:使用 csv.reader(返回列表)
import csv
with open('data.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
print(row) # row 是一个列表,如 ['Name', 'Age', 'City']
如果你需要跳过表头:
with open('data.csv', mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
header = next(reader) # 读取第一行(表头)
for row in reader:
print(row) # 从第二行开始
方法B:使用 csv.DictReader(返回字典,按列名访问)
import csv
with open('data.csv', mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
print(row['Name'], row['Age']) # 通过列名取值
写入CSV文件
方法A:使用 csv.writer
import csv
data = [
['Name', 'Age', 'City'],
['Alice', 30, 'New York'],
['Bob', 25, 'Los Angeles'],
['Charlie', 35, 'Chicago']
]
with open('output.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerows(data) # 一次性写入多行
注意:
newline=''是必要的,否则在Windows上会出现多余空行。
方法B:使用 csv.DictWriter(从字典列表写入)
import csv
fieldnames = ['Name', 'Age', 'City']
data = [
{'Name': 'Alice', 'Age': 30, 'City': 'New York'},
{'Name': 'Bob', 'Age': 25, 'City': 'Los Angeles'}
]
with open('output.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader() # 写入表头
writer.writerows(data) # 写入数据行
使用 pandas(适合复杂数据处理)
如果你已经在做数据分析工作,pandas 是最方便的选择。
读取CSV
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head()) # 显示前5行
写入CSV
# df 是已有的 DataFrame
df.to_csv('output.csv', index=False) # index=False 表示不写入行索引
常用参数:
sep=';':指定分隔符(如制表符\t)encoding='utf-8-sig':处理中文乱码时常用,Excel兼容na_rep='N/A':指定空值的填充内容
常见注意事项
- 编码问题:处理中文CSV时,建议使用
encoding='utf-8-sig',这样Excel打开不会乱码。 - 表头处理:使用
csv.DictReader或pandas时,默认第一行是表头。 - 特殊字符:如果数据中包含逗号、换行符或引号,
csv模块会自动处理(加引号转义),你无需手动处理。 - 大文件:对于非常大的CSV,使用
csv.reader逐行读取(不会一次性加载所有数据到内存)。
示例:读取CSV并进行简单统计
import csv
total_age = 0
count = 0
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
total_age += int(row['Age'])
count += 1
if count > 0:
print(f"平均年龄: {total_age / count:.2f}")
- 如果只是简单处理CSV(不需要复杂计算),用 Python 内置的
csv模块就足够。 - 如果你还需要进行筛选、分组、绘图等操作,建议直接使用
pandas——它的read_csv和to_csv几乎能处理所有CSV场景。
标签: 读写CSV