Python中处理CSV文件的核心方法详解

 更新时间:2026年03月13日 08:39:34   作者:李昊哲小课  
本文介绍了Python标准库csv模块的基本功能和使用方法,包括读取、写入、处理带标题行的CSV文件,以及自定义分隔符和引用符,通过示例和代码优化建议,帮助读者更好地理解和应用CSV文件处理,需要的朋友可以参考下

1. 模块简介

CSV(Comma-Separated Values,逗号分隔值)是一种常见的文件格式,用于存储表格数据。它使用逗号作为字段分隔符,每行代表一条记录。

Python的csv模块提供了专门用于处理CSV文件的功能,使得读取和写入CSV文件变得简单高效。

主要功能包括:

  • 读取CSV文件内容
  • 写入数据到CSV文件
  • 处理带标题行的CSV文件
  • 使用字典形式读写CSV数据
  • 自定义分隔符和引用符
  • 处理CSV中的特殊情况

2. 核心功能详解

2.1 基本CSV读取

使用csv.reader对象可以逐行读取CSV文件内容。

基本用法:

import csv

# 读取CSV文件
with open('employees.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    for row_num, row in enumerate(reader, 1):
        print(f"第{row_num}行: {row}")

注意事项:

  • 使用with语句确保文件正确关闭
  • 指定encoding='utf-8'以正确处理中文字符
  • csv.reader返回的是一个迭代器,每次迭代返回一行数据,作为列表

2.2 CSV写入操作

使用csv.writer对象可以将数据写入CSV文件。

基本用法:

import csv

# 准备数据
sample_data = [
    ['姓名', '年龄', '城市', '职业'],
    ['张三', '25', '北京', '工程师'],
    ['李四', '30', '上海', '设计师'],
    ['王五', '28', '广州', '产品经理']
]

# 写入CSV文件
with open('employees.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerows(sample_data)

print("已创建示例CSV文件 'employees.csv'")

注意事项:

  • 使用'w'模式创建新文件或覆盖现有文件
  • 设置newline=''以避免额外的空行
  • writerows()方法可以一次写入多行数据
  • writerow()方法用于写入单行数据

2.3 使用DictReader处理带标题的CSV

csv.DictReader可以将CSV文件的第一行作为字段名,返回的每行数据是一个字典,键为字段名,值为对应的数据。

基本用法:

import csv

with open('employees.csv', 'r', encoding='utf-8') as file:
    dict_reader = csv.DictReader(file)
    for row_num, row in enumerate(dict_reader, 1):
        print(f"员工{row_num}:")
        for key, value in row.items():
            print(f"  {key}: {value}")
        print()

优势:

  • 可以通过字段名访问数据,而不是通过索引
  • 代码更具可读性,尤其是当CSV文件字段较多时
  • 字段顺序变化时代码仍然可以正常工作

2.4 使用DictWriter写入数据

csv.DictWriter可以将字典数据写入CSV文件,需要指定字段名。

基本用法:

import csv

# 准备字段名称和数据
fieldnames = ['姓名', '年龄', '城市', '职业']
new_employee = {
    '姓名': '周九',
    '年龄': '29',
    '城市': '武汉',
    '职业': '前端开发'
}

# 追加新员工数据
with open('employees.csv', 'a', newline='', encoding='utf-8') as file:
    dict_writer = csv.DictWriter(file, fieldnames=fieldnames)
    dict_writer.writerow(new_employee)

print("已使用DictWriter添加新员工")

注意事项:

  • 必须指定fieldnames参数,定义字段的顺序
  • 字典中的键必须与fieldnames中的字段名匹配
  • 如果字典中缺少某些字段,会写入空值

2.5 自定义分隔符和引用符

CSV文件不一定使用逗号作为分隔符,csv模块支持自定义分隔符和引用符。

基本用法:

import csv

# 创建使用分号分隔的CSV文件
custom_data = [
    ['产品名称', '价格', '库存'],
    ['苹果', '5.5', '100'],
    ['香蕉', '3.2', '200'],
    ['橙子', '4.8', '150']
]

with open('products.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file, delimiter=';', quoting=csv.QUOTE_MINIMAL)
    writer.writerows(custom_data)

print("已创建使用分号分隔的CSV文件 'products.csv'")

# 读取自定义分隔符的CSV文件
with open('products.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file, delimiter=';')
    for row_num, row in enumerate(reader, 1):
        print(f"第{row_num}行: {row}")

常用引用模式:

  • csv.QUOTE_MINIMAL:只在必要时使用引号
  • csv.QUOTE_ALL:对所有字段使用引号
  • csv.QUOTE_NONNUMERIC:对非数字字段使用引号
  • csv.QUOTE_NONE:不使用引号

2.6 处理CSV中的特殊情况

CSV文件中可能包含特殊字符,如引号、逗号、换行符等,csv模块可以正确处理这些情况。

基本用法:

import csv

# 创建包含特殊字符的CSV数据
special_data = [
    ['姓名', '描述'],
    ['张三', '喜欢"Python"编程'],
    ['李四', '爱好: 读书, 游泳, 旅行'],
    ['王五', '地址: 北京市朝阳区\n邮编: 100000']
]

with open('special.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file, quoting=csv.QUOTE_ALL)
    writer.writerows(special_data)

print("已创建包含特殊字符的CSV文件 'special.csv'")

# 读取包含特殊字符的CSV文件
with open('special.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    for row_num, row in enumerate(reader, 1):
        print(f"第{row_num}行: {row}")

注意事项:

  • 使用quoting=csv.QUOTE_ALL可以确保特殊字符被正确处理
  • 包含逗号、引号或换行符的字段会被自动加上引号
  • 读取时这些特殊字符会被正确解析

3. 实用示例

3.1 CSV数据统计

示例:统计不同城市的员工数量

import csv

def count_employees_by_city(csv_file):
    """统计不同城市的员工数量"""
    city_count = {}
    
    with open(csv_file, 'r', encoding='utf-8') as file:
        dict_reader = csv.DictReader(file)
        for row in dict_reader:
            city = row['城市']
            if city in city_count:
                city_count[city] += 1
            else:
                city_count[city] = 1
    
    return city_count

# 示例使用
if __name__ == "__main__":
    # 假设employees.csv文件已存在
    city_counts = count_employees_by_city('employees.csv')
    print("各城市员工数量统计:")
    for city, count in city_counts.items():
        print(f"  {city}: {count}人")

3.2 CSV数据转换

示例:将CSV数据转换为JSON格式

import csv
import json

def csv_to_json(csv_file, json_file):
    """将CSV文件转换为JSON文件"""
    data = []
    
    with open(csv_file, 'r', encoding='utf-8') as file:
        dict_reader = csv.DictReader(file)
        for row in dict_reader:
            data.append(row)
    
    with open(json_file, 'w', encoding='utf-8') as file:
        json.dump(data, file, ensure_ascii=False, indent=2)
    
    print(f"已将 {csv_file} 转换为 {json_file}")

# 示例使用
if __name__ == "__main__":
    csv_to_json('employees.csv', 'employees.json')

3.3 CSV数据过滤

示例:过滤特定条件的记录

import csv

def filter_employees_by_age(csv_file, min_age):
    """过滤年龄大于等于指定值的员工"""
    filtered_data = []
    
    with open(csv_file, 'r', encoding='utf-8') as file:
        dict_reader = csv.DictReader(file)
        fieldnames = dict_reader.fieldnames
        
        for row in dict_reader:
            if int(row['年龄']) >= min_age:
                filtered_data.append(row)
    
    # 保存过滤结果
    output_file = f'employees_age_{min_age}+.csv'
    with open(output_file, 'w', newline='', encoding='utf-8') as file:
        dict_writer = csv.DictWriter(file, fieldnames=fieldnames)
        dict_writer.writeheader()
        dict_writer.writerows(filtered_data)
    
    print(f"已过滤并保存结果到 {output_file}")
    return filtered_data

# 示例使用
if __name__ == "__main__":
    filtered = filter_employees_by_age('employees.csv', 30)
    print(f"过滤后共有 {len(filtered)} 名员工")

3.4 CSV数据合并

示例:合并多个CSV文件

import csv
import os

def merge_csv_files(input_files, output_file):
    """合并多个CSV文件"""
    if not input_files:
        print("没有输入文件")
        return
    
    # 读取第一个文件的表头
    with open(input_files[0], 'r', encoding='utf-8') as file:
        dict_reader = csv.DictReader(file)
        fieldnames = dict_reader.fieldnames
    
    # 合并数据
    merged_data = []
    for csv_file in input_files:
        with open(csv_file, 'r', encoding='utf-8') as file:
            dict_reader = csv.DictReader(file)
            for row in dict_reader:
                merged_data.append(row)
    
    # 写入合并结果
    with open(output_file, 'w', newline='', encoding='utf-8') as file:
        dict_writer = csv.DictWriter(file, fieldnames=fieldnames)
        dict_writer.writeheader()
        dict_writer.writerows(merged_data)
    
    print(f"已合并 {len(input_files)} 个CSV文件到 {output_file}")
    print(f"总记录数: {len(merged_data)}")

# 示例使用
if __name__ == "__main__":
    input_files = ['employees1.csv', 'employees2.csv', 'employees3.csv']
    # 过滤存在的文件
    input_files = [f for f in input_files if os.path.exists(f)]
    if input_files:
        merge_csv_files(input_files, 'merged_employees.csv')
    else:
        print("没有找到输入文件")

4. 代码优化建议

  1. 使用上下文管理器:始终使用with语句来管理文件操作,确保文件正确关闭。
  2. 指定编码:在打开文件时明确指定encoding='utf-8',确保正确处理中文字符。
  3. 错误处理:添加适当的错误处理,如FileNotFoundErrorPermissionError等。
  4. 选择合适的读写方式
    1. 对于简单的CSV文件,使用csv.readercsv.writer
    2. 对于带标题的CSV文件,使用csv.DictReadercsv.DictWriter
  5. 处理大文件:对于大型CSV文件,考虑使用生成器表达式或分块处理,避免一次性加载所有数据到内存。
  6. 自定义分隔符:当处理非标准CSV文件时,记得指定正确的分隔符。
  7. 引用符设置:根据数据特点选择合适的引用模式,确保特殊字符被正确处理。
  8. 字段名处理:使用DictReader时,注意CSV文件的第一行是否包含字段名。
  9. 数据类型转换:CSV文件中的数据默认都是字符串类型,需要根据需要进行类型转换。
  10. 性能优化:对于大量数据的读写,考虑使用csv模块的快速模式,或使用第三方库如pandas

5. 常见问题与解决方案

5.1 问题:CSV文件中包含中文字符导致乱码

解决方案:在打开文件时明确指定encoding='utf-8',确保中文字符被正确处理。

5.2 问题:CSV文件读取时出现额外的空行

解决方案:在打开文件时设置newline='',避免Python的换行符处理与CSV模块的处理冲突。

5.3 问题:CSV文件中的数字被读取为字符串

解决方案:在读取后手动将需要的字段转换为数字类型,例如:age = int(row['年龄'])

5.4 问题:CSV文件中的字段包含逗号或引号

解决方案:使用适当的引用模式,如quoting=csv.QUOTE_ALL,确保特殊字符被正确处理。

5.5 问题:DictReader读取时字段名包含空格

解决方案:可以在读取后手动处理字段名,去除空格,或者在写入时确保字段名不包含空格。

5.6 问题:大型CSV文件读取内存不足

解决方案:使用迭代器逐行读取,避免一次性加载所有数据到内存。

5.7 问题:写入CSV文件时日期格式不正确

解决方案:在写入前将日期转换为适当的字符串格式,例如:date.strftime('%Y-%m-%d')

6. 总结

CSV文件是一种简单而广泛使用的数据交换格式,Python的csv模块提供了强大的功能来处理CSV文件。通过本教程,你应该已经了解了:

  • 如何使用csv.readercsv.writer进行基本的CSV读写操作
  • 如何使用csv.DictReadercsv.DictWriter以字典形式处理CSV数据
  • 如何自定义分隔符和引用符
  • 如何处理CSV中的特殊情况
  • 实用的CSV数据处理示例
  • 常见问题的解决方案

在实际应用中,CSV文件处理是一个常见的任务,无论是数据导入导出、数据清洗还是数据分析,都需要掌握这些基本技能。通过不断练习和实践,你将能够更加高效地处理各种CSV文件操作任务。

对于更复杂的CSV处理需求,你还可以考虑使用第三方库如pandas,它提供了更高级的CSV处理功能,如数据框操作、数据筛选、聚合等。

以上就是Python中处理CSV文件的核心方法详解的详细内容,更多关于Python处理CSV文件方法的资料请关注脚本之家其它相关文章!

相关文章

  • python导出requirements.txt的几种方法总结

    python导出requirements.txt的几种方法总结

    这篇文章主要介绍了python导出requirements.txt的几种方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • PIP和conda 更换国内安装源的方法步骤

    PIP和conda 更换国内安装源的方法步骤

    这篇文章主要介绍了PIP和conda 更换国内安装源的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • python如何通过闭包实现计算器的功能

    python如何通过闭包实现计算器的功能

    这篇文章主要介绍了python如何通过闭包实现计算器的功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python利用numpy实现三层神经网络的示例代码

    Python利用numpy实现三层神经网络的示例代码

    这篇文章主要介绍了Python利用numpy实现三层神经网络的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python 4种实现定时任务的方案

    Python 4种实现定时任务的方案

    这篇文章主要给大家分享了Python 4种实现定时任务的方案,运用 while True: + sleep()、Timeloop 库、threading.Timer 、内置模块 sched ,下面就来看看具体的实现过程吧
    2021-12-12
  • Python更换pip源方法过程解析

    Python更换pip源方法过程解析

    这篇文章主要介绍了Python更换pip源方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 使用实现pandas读取csv文件指定的前几行

    使用实现pandas读取csv文件指定的前几行

    下面小编就为大家分享一篇使用实现pandas读取csv文件指定的前几行,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • matplotlib实现热成像图colorbar和极坐标图的方法

    matplotlib实现热成像图colorbar和极坐标图的方法

    今天小编就为大家分享一篇matplotlib实现热成像图colorbar和极坐标图的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python包装异常处理方法

    Python包装异常处理方法

    这篇文章主要介绍了Python包装异常处理方法,相比java,python的异常和java中不同,python主要是防止程序异常被中止。一旦被catch后它还行往下执行,本文就分享python相关的异常处理方法,需要的小伙伴可以参考一下
    2022-06-06
  • 用Python的Django框架完成视频处理任务的教程

    用Python的Django框架完成视频处理任务的教程

    这篇文章主要介绍了用Python的Django框架完成视频处理任务的教程,包括用户的视频上传和播放以及下载功能的实现,需要的朋友可以参考下
    2015-04-04

最新评论