使用 Python 读取并写入 CSV 文件(千字长文)

为什么需要掌握 CSV 文件处理技能

在数据分析和办公自动化场景中,CSV 文件作为最基础的数据交换格式之一,其重要性不亚于编程中的"Hello World"。无论是处理销售报表、分析实验数据还是管理客户信息,掌握 使用 Python 读取并写入 CSV 文件 的能力都能大幅提升工作效率。通过本文,您将系统性地学习两种核心处理方式:标准库模块和第三方库,并通过实际案例理解其应用场景。

CSV 文件的基础知识

什么是 CSV 文件

CSV(Comma-Separated Values)文件本质上是纯文本文件,采用逗号作为字段分隔符。这种格式的优点在于:

  • 跨平台兼容性好
  • 无需复杂解析即可直接在 Excel 等工具中打开
  • 文件体积小,适合网络传输

一个典型的 CSV 文件结构如下:

姓名,年龄,城市
张三,28,北京
李四,32,上海
王五,24,广州

Python 处理 CSV 的两种方式

  1. 标准库 csv:Python 内置模块,无需额外安装,适合简单场景
  2. pandas 库:功能强大的数据分析库,提供更优雅的接口,适合复杂处理

使用标准库 csv 读取 CSV 文件

基本读取方法

import csv

with open('users.csv', 'r', encoding='utf-8') as f:
    # 创建 reader 对象
    reader = csv.reader(f)
    
    # 读取第一行作为表头
    header = next(reader)
    print(f"表头: {header}")
    
    # 逐行读取数据
    for row in reader:
        print(f"数据行: {row}")

这段代码通过 csv.reader 将文件内容转换为可迭代对象,next() 函数跳过表头行,for 循环遍历剩余数据行。建议使用 with open 语句确保文件正确关闭。

处理特殊字符

当遇到中文乱码或特殊字段时,需指定编码格式:

with open('data.csv', 'r', encoding='gbk') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row['姓名'])  # 使用字段名访问数据

DictReader 会将表头自动转换为字典键,这种面向对象的访问方式比索引访问更直观。

使用 pandas 库操作 CSV 文件

安装与导入

pip install pandas
import pandas as pd

df = pd.read_csv('sales.csv', encoding='utf-8')
print(df.head(3))  # 查看前三行数据

pandas 的 read_csv 函数支持自动识别表头、指定分隔符等高级特性,是处理结构化数据的强大工具。

数据写入操作

new_data = {
    '月份': ['2023-01', '2023-02'],
    '销售额': [120000, 150000]
}

df_new = pd.DataFrame(new_data)

df_new.to_csv('new_sales.csv', index=False, encoding='utf-8-sig')

to_csv 函数的 index=False 参数能避免写入自动生成的行索引,utf-8-sig 编码可兼容 Excel 的中文显示。

实战案例:销售数据统计

需求分析

某电商平台需要统计最近季度的销售数据,包含:

  1. 读取历史销售记录
  2. 计算各地区总销售额
  3. 将结果保存为新文件

完整实现方案

import pandas as pd

df = pd.read_csv('sales_data.csv', encoding='utf-8')

result = df.groupby('地区')['销售额'].sum().reset_index()

result.to_csv('region_sales_summary.csv', index=False, encoding='utf-8-sig')

该案例展示了 pandas 的分组统计功能,通过 groupby 方法快速完成数据聚合,最终将结构化结果保存为 CSV 文件。

常见问题与解决方案

编码错误处理

当遇到 "UnicodeDecodeError" 时:

  1. 尝试使用 encoding='gbk'encoding='latin1'
  2. errors='ignore' 忽略无法解码字符
  3. 添加 on_bad_lines='skip' 跳过错误行

写入数据时的注意事项

with open('output.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['ID', '姓名', '分数'])  # 写入表头
    writer.writerows([
        [1, '张三', 95],
        [2, '李四', 88]
    ])

newline='' 参数能防止 Windows 系统下出现空行,writerows 支持批量写入数据。

性能优化技巧

大文件处理

当处理百万级行数的 CSV 文件时:

  1. 使用 pandas 的 chunksize 参数分块读取
for chunk in pd.read_csv('big_data.csv', chunksize=100000):
    process(chunk)  # 自定义处理函数
  1. 采用 csv 模块的迭代器特性
with open('big_file.csv', 'r') as f:
    reader = csv.reader(f)
    next(reader)  # 跳过表头
    for row in reader:
        process_row(row)  # 单行处理

内存管理建议

  • pandas 写入时使用 compression='gzip' 参数可压缩文件
  • 读取时指定 usecols 仅加载必要列
pd.read_csv('data.csv', usecols=['关键列1', '关键列2'])

代码规范与安全建议

安全编码实践

  1. 文件操作时始终使用 with 语句
  2. 添加异常处理机制
try:
    with open('file.csv', 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            process(row)
except FileNotFoundError:
    print("文件不存在,请检查路径")

数据验证技巧

  • 使用 pandasisnull() 检查空值
  • 通过 dtype 参数指定列数据类型
pd.read_csv('data.csv', dtype={'ID': int, '分数': float})

总结与进阶方向

通过本文的学习,您已经掌握了 使用 Python 读取并写入 CSV 文件 的两种核心方式:标准库和 pandas。选择哪种方法取决于具体需求 - 标准库适合简单直接的场景,而 pandas 能处理更复杂的数据操作任务。

建议读者从以下维度进行实践:

  1. 将 CSV 文件与数据库操作结合
  2. 尝试处理 JSON 和 CSV 之间的相互转换
  3. 学习使用 numpy 进行数据预处理
  4. 探索 Dask 处理超大规模 CSV 文件

掌握这些技能后,您将能够轻松应对日常工作中 80% 的数据处理需求,为后续学习 Excel 操作、数据可视化等进阶内容打下坚实基础。