Python中如何读写CSV文件


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='"')

四、性能优化技巧

  1. 使用pandas的dtype参数:指定列数据类型减少内存占用
   dtype = {'age': 'int8', 'price': 'float32'}
   df = pd.read_csv('data.csv', dtype=dtype)
  1. 只读取需要的列
   # 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'])
  1. 使用生成器处理大文件
   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,超大文件考虑分块处理或专用工具。

,

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注