python 处理 csv

6 阅读3分钟

在 Python 中处理 CSV 文件,最常用且标准的方式是使用内置的 csv 模块。对于更复杂的数据分析任务,通常会使用 pandas 库。

这里我为你准备了一份基于内置 csv 模块的完整 Demo。它涵盖了读取、写入以及健壮的错误处理机制(如文件不存在、编码错误、权限问题等)。

Python CSV 处理完整示例

import csv
import os

def read_csv_demo(file_path):
    """
    安全地读取 CSV 文件并打印内容
    """
    # 检查文件是否存在
    if not os.path.exists(file_path):
        print(f"错误: 文件 '{file_path}' 不存在。")
        return

    try:
        # 使用 'with' 语句确保文件最后会自动关闭
        # encoding='utf-8' 防止中文乱码
        with open(file_path, mode='r', encoding='utf-8') as f:
            # 使用 DictReader 可以像字典一样通过列名访问数据
            reader = csv.DictReader(f)
            
            print(f"--- 正在读取文件: {file_path} ---")
            for row in reader:
                # 假设 CSV 有 'Name' 和 'Age' 列
                name = row.get('Name', '未知')
                age = row.get('Age', '未知')
                print(f"姓名: {name}, 年龄: {age}")
                
    except FileNotFoundError:
        print("错误: 未找到该文件。")
    except UnicodeDecodeError:
        print("错误: 文件编码不是 UTF-8,请检查文件格式。")
    except csv.Error as e:
        print(f"CSV 处理出错: {e}")
    except Exception as e:
        print(f"发生未知错误: {e}")


def write_csv_demo(file_path, data):
    """
    安全地将数据写入 CSV 文件
    :param data: 包含字典的列表,例如 [{'Name': 'Alice', 'Age': 25}]
    """
    if not data:
        print("警告: 没有数据可写入。")
        return

    # 获取字典的所有键作为 CSV 的表头
    fieldnames = data[0].keys()

    try:
        # newline='' 是为了防止在 Windows 上写入时出现额外的空行
        with open(file_path, mode='w', newline='', encoding='utf-8') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            
            # 写入表头 (第一行)
            writer.writeheader()
            
            # 写入所有数据行
            writer.writerows(data)
            
        print(f"成功: 数据已写入到 '{file_path}'")

    except PermissionError:
        print(f"错误: 权限不足。请检查文件 '{file_path}' 是否被其他程序(如 Excel)打开。")
    except Exception as e:
        print(f"写入过程中发生错误: {e}")


# --- 主程序逻辑 ---
if __name__ == "__main__":
    test_file = "data_demo.csv"
    
    # 准备要写入的数据
    sample_data = [
        {"Name": "张三", "Age": "28", "City": "北京"},
        {"Name": "李四", "Age": "22", "City": "上海"},
        {"Name": "Wang Wu", "Age": "35", "City": "Guangzhou"}
    ]

    # 1. 执行写入
    write_csv_demo(test_file, sample_data)

    # 2. 执行读取
    read_csv_demo(test_file)

关键点解析:

  1. with open(...): 这是处理文件的最佳实践。它被称为上下文管理器,能保证即使在处理过程中发生异常,文件也会被正确关闭,释放系统资源。
  2. newline='': 在写入 CSV 时,这个参数非常重要。如果不加,在 Windows 平台上每行数据之间可能会出现多余的空行。
  3. csv.DictReader & csv.DictWriter:
    • 比起普通的 csv.reader(返回列表),DictReader 将每行映射为一个字典(Dictionary),使代码更具可读性(通过列名引用数据,而不是索引 [0][1])。
  4. 错误处理 (Error Handling):
    • FileNotFoundError: 针对文件丢失的情况。
    • PermissionError: 非常常见。如果 CSV 文件正被 Excel 占用,Python 写入时会抛出此错误。
    • UnicodeDecodeError: 处理中文时常遇到的问题。如果文件是 GBK 编码而你用 UTF-8 读取,就会报错。
    • os.path.exists: 在操作前预检查,提高代码健壮性。

进阶建议:

如果你需要处理超大规模数据或者进行复杂计算(如排序、筛选、求和),强烈建议学习使用 pandas 库:

# 核心代码示例 (需安装: pip install pandas)
import pandas as pd

# 读取
df = pd.read_csv('file.csv')

# 写入
df.to_csv('output.csv', index=False)

但在基础自动化任务或环境受限(不能安装第三方库)的情况下,上面的内置 csv 模块代码是最高效、最通用的选择。