CSV(Comma-Separated Values)是一种常用的数据存储格式,Python提供了多种处理CSV文件的方法。本文将详细介绍如何使用Python内置模块和第三方库高效地读写CSV文件。
一、使用Python内置csv模块
Python标准库中的csv
模块是处理CSV文件的基础工具。
1. 读取CSV文件
基本读取方法
import csv
with open('data.csv', mode='r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
for row in csv_reader:
print(row) # 每行是一个列表
以字典形式读取(推荐)
with open('data.csv', mode='r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(row) # 每行是一个有序字典,键为列名
print(row['name']) # 访问特定列
2. 写入CSV文件
基本写入方法
import csv
data = [
['姓名', '年龄', '城市'],
['张三', '25', '北京'],
['李四', '30', '上海']
]
with open('output.csv', mode='w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(data) # 写入多行
以字典形式写入
data = [
{'name': '张三', 'age': 25, 'city': '北京'},
{'name': '李四', 'age': 30, 'city': '上海'}
]
with open('output_dict.csv', mode='w', encoding='utf-8', newline='') as file:
fieldnames = ['name', 'age', 'city']
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader() # 写入表头
writer.writerows(data) # 写入数据
3. csv模块常用参数
delimiter
:指定分隔符(默认为逗号)quotechar
:指定引用符(默认为双引号)quoting
:控制引用行为skipinitialspace
:忽略分隔符后的空格
# 处理以分号分隔的CSV文件
with open('data.csv', mode='r') as file:
reader = csv.reader(file, delimiter=';')
for row in reader:
print(row)
二、使用pandas库处理CSV
pandas是数据分析的利器,提供了更强大的CSV处理功能。
1. 读取CSV文件
import pandas as pd
# 基本读取
df = pd.read_csv('data.csv')
# 带参数读取
df = pd.read_csv('data.csv',
encoding='gbk', # 指定编码
sep='\t', # 指定分隔符
header=0, # 指定表头行
skiprows=2, # 跳过前2行
na_values=['NA', 'NULL']) # 指定缺失值
2. 写入CSV文件
# 基本写入
df.to_csv('output.csv', index=False)
# 带参数写入
df.to_csv('output.csv',
index=False, # 不写入行索引
encoding='utf-8', # 指定编码
sep='|', # 指定分隔符
columns=['col1', 'col2'], # 指定写入列
na_rep='NULL') # 缺失值替换
3. pandas处理大型CSV文件
对于大文件,可以使用分块读取:
chunk_size = 10000 # 每次读取1万行
chunks = pd.read_csv('large_data.csv', chunksize=chunk_size)
for chunk in chunks:
process(chunk) # 处理每个数据块
三、处理特殊CSV文件
1. 含中文的CSV文件
# 读取
with open('data.csv', mode='r', encoding='gbk') as file:
reader = csv.reader(file)
# 写入
with open('output.csv', mode='w', encoding='utf-8-sig', newline='') as file:
writer = csv.writer(file)
2. 不规则CSV文件
# 使用pandas处理不规则分隔符
df = pd.read_csv('data.csv', sep='\s+') # 匹配任意空白符
# 使用csv模块处理
with open('data.csv') as file:
for line in file:
row = line.strip().split() # 自定义分割逻辑
3. 含引号和换行符的CSV
# 读取时正确处理引号内的换行符
with open('data.csv', newline='') as file:
reader = csv.reader(file, quotechar='"')
四、性能优化技巧
- 使用pandas的
dtype
参数:指定列数据类型减少内存占用
dtype = {'age': 'int8', 'price': 'float32'}
df = pd.read_csv('data.csv', dtype=dtype)
- 只读取需要的列:
# csv模块
with open('data.csv') as file:
reader = csv.DictReader(file)
for row in reader:
print(row['needed_column'])
# pandas
df = pd.read_csv('data.csv', usecols=['col1', 'col2'])
- 使用生成器处理大文件:
def csv_reader(file):
with open(file) as f:
reader = csv.reader(f)
for row in reader:
yield row
for row in csv_reader('large.csv'):
process(row)
五、实际应用示例
1. 数据清洗案例
import pandas as pd
# 读取数据
df = pd.read_csv('dirty_data.csv')
# 清洗数据
df['price'] = df['price'].str.replace('$', '').astype(float)
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df = df.dropna() # 删除缺失值
# 保存清洗后的数据
df.to_csv('cleaned_data.csv', index=False)
2. 合并多个CSV文件
import glob
import pandas as pd
# 获取所有CSV文件
csv_files = glob.glob('data/*.csv')
# 合并文件
dfs = []
for file in csv_files:
df = pd.read_csv(file)
dfs.append(df)
merged_df = pd.concat(dfs, ignore_index=True)
merged_df.to_csv('merged_data.csv', index=False)
六、常见问题解答
Q: 如何处理CSV中的BOM头?
A: 使用encoding='utf-8-sig'
打开文件
Q: 为什么我的CSV文件在Excel中显示乱码?
A: 尝试使用encoding='gbk'
或utf-8-sig
编码写入
Q: 如何跳过CSV文件的注释行?
A: 在pd.read_csv()
中使用comment='#'
参数,或手动过滤
Q: 处理超大CSV文件时内存不足怎么办?
A: 使用分块读取(chunksize)或考虑使用Dask等工具
通过本教程,你应该已经掌握了Python处理CSV文件的多种方法。根据你的具体需求选择合适的方法:简单任务使用csv模块,数据分析任务使用pandas,超大文件考虑分块处理或专用工具。