4.9 Python3 csv 模块

csv 模块是 Python 标准库中用于处理 CSV (Comma-Separated Values) 文件的模块,它提供了读取和写入 CSV 文件的功能。


目录

CSV 文件基本概念

主要功能

1. 读取 CSV 文件

csv.reader 方法

示例:自定义分隔符

2. 写入 CSV 文件

csv.writer 方法

写入单行

3. 使用字典方式读写(推荐)

csv.DictReader - 读取为字典

csv.DictWriter - 从字典写入

高级用法

1. 处理不同方言的 CSV 文件

2. 处理包含 Unicode 字符的文件

3. 自定义转换器

注意事项

实际应用示例

示例1:计算 CSV 文件中数值列的平均值

示例2:过滤并保存符合条件的记录


CSV 文件基本概念

CSV 文件是以纯文本形式存储表格数据(数字和文本)的文件格式,其特点:

  • 每条记录占一行

  • 字段间用逗号分隔(也可以是其他分隔符)

  • 字段内容包含逗号或换行符时需要用引号括起来


主要功能

1. 读取 CSV 文件

csv.reader 方法

import csv

with open('data.csv', 'r', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)  # 每行作为一个列表返回

参数说明:

  • delimiter: 指定分隔符,默认为 ','

  • quotechar: 指定引用符,默认为 '"'

  • quoting: 引用规则,可选值:

    • csv.QUOTE_MINIMAL: 只在必要时引用(默认)

    • csv.QUOTE_ALL: 全部引用

    • csv.QUOTE_NONNUMERIC: 非数字字段引用

    • csv.QUOTE_NONE: 不引用

示例:自定义分隔符

with open('data.tsv', 'r', newline='') as f:
    reader = csv.reader(f, delimiter='\t')  # 处理制表符分隔的文件
    for row in reader:
        print(row)

2. 写入 CSV 文件

csv.writer 方法

import csv

data = [
    ['Name', 'Age', 'City'],
    ['Alice', '25', 'New York'],
    ['Bob', '30', 'London'],
    ['Charlie', '35', 'Paris']
]

with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(data)  # 写入多行
写入单行

with open('output.csv', 'a', newline='') as f:  # 'a' 表示追加模式
    writer = csv.writer(f)
    writer.writerow(['David', '40', 'Tokyo'])  # 写入单行

3. 使用字典方式读写(推荐)

csv.DictReader - 读取为字典

with open('data.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row['Name'], row['Age'])  # 通过列名访问数据
csv.DictWriter - 从字典写入

fieldnames = ['Name', 'Age', 'City']

data = [
    {'Name': 'Alice', 'Age': '25', 'City': 'New York'},
    {'Name': 'Bob', 'Age': '30', 'City': 'London'}
]

with open('output.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()  # 写入标题行
    writer.writerows(data)  # 写入多行数据

高级用法

1. 处理不同方言的 CSV 文件

csv.register_dialect('unix', delimiter=':', quoting=csv.QUOTE_NONE)

with open('data.unix', 'r') as f:
    reader = csv.reader(f, dialect='unix')
    for row in reader:
        print(row)

2. 处理包含 Unicode 字符的文件

with open('unicode.csv', 'r', encoding='utf-8-sig') as f:  # utf-8-sig 处理BOM
    reader = csv.reader(f)
    for row in reader:
        print(row)

3. 自定义转换器

def parse_percent(value):
    return float(value.strip('%')) / 100

with open('data.csv', 'r') as f:
    reader = csv.reader(f)
    next(reader)  # 跳过标题行
    for row in reader:
        value = parse_percent(row[1])
        print(f"原始值: {row[1]}, 转换后: {value}")

注意事项

  1. newline='' 参数:在打开 CSV 文件时建议设置,避免在 Windows 上出现空行问题

  2. 编码问题:处理非 ASCII 字符时明确指定编码(通常用 utf-8

  3. 大文件处理:对于大 CSV 文件,考虑逐行处理而非一次性读取全部内容

  4. 安全性:处理来自不可信源的 CSV 文件时要小心,可能包含恶意内容


实际应用示例

示例1:计算 CSV 文件中数值列的平均值

import csv

total = 0
count = 0

with open('grades.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        total += float(row['Score'])
        count += 1

print(f"平均分: {total/count:.2f}")

示例2:过滤并保存符合条件的记录

import csv

with open('input.csv', 'r') as infile, open('output.csv', 'w', newline='') as outfile:
    reader = csv.DictReader(infile)
    writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames)
    writer.writeheader()
    
    for row in reader:
        if int(row['Age']) > 30:
            writer.writerow(row)

csv 模块是 Python 中处理 CSV 文件的强大工具,掌握它可以高效地进行数据导入导出操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值