Python CSV文件读写全指南:从内置csv库到Pandas实战

Finn
Finn
发布时间:2026-10-16| 1人浏览过
原创

本文详细介绍Python中处理CSV文件的两种核心方式。首先解析内置csv库的reader与DictReader用法,涵盖delimiter、quotechar等关键参数及处理含逗号字段的技巧;随后深入Pandas库,演示如何快速读取、格式化日期及写入CSV文件,提供从基础到进阶的完整代码示例。

CSV文件基本概念

CSV(Comma-Separated Values,逗号分隔值)是一种纯文本格式,专门用于存储表格数据。由于它是纯文本文件,因此仅包含可打印的ASCII或Unicode字符,无法嵌入二进制数据或复杂格式。

其结构通常由文件名暗示,即使用逗号作为字段分隔符来区分各个数据值。

column 1 name,column 2 name, column 3 name
first row data 1,first row data 2,first row data 3
second row data 1,second row data 2,second row data 3
...

数据行通过逗号进行分隔。首行通常定义列名,但有时首行可能为空,直接开始存储实际数据。后续每一行代表一条记录,文件大小仅受系统限制。

CSV文件的来源与应用

这类文件通常由处理大量数据的程序生成,常见于从电子表格或数据库导出数据,以及向其他应用程序导入数据。例如,数据挖掘工具可将结果导出为CSV,随后导入电子表格进行数据分析、生成图表演示或编制报告。

CSV文件易于通过编程手段处理。任何支持文本输入和字符串操作的语言(如Python)均可直接解析和操作此类文件。

CSV模块解析机制

Python内置的csv库提供了读取和写入CSV文件的功能。该库专为兼容Excel生成的CSV格式而设计,能够适应多种CSV变体。它包含用于从CSV文件读取、写入及处理数据的对象和代码。

读取CSV文件的方法

在Python中,首先使用内置的open()函数以文本模式打开CSV文件,获取文件对象。随后,利用csv模块中的reader对象完成数据读取。

示例文件:employee_birthday.txt

name,department,birthday month
John Smith,Accounting,November
Erica Meyers,IT,March

直接读取方法。

import csv

with open('employee_birthday.txt') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        else:
            print(f'\t{row[0]} works in the {row[1]} department, and was born in {row[2]}.')
            line_count += 1
    print(f'Processed {line_count} lines.')

字典方式读取方法。

import csv

with open('employee_birthday.txt', mode='r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        print(f'\t{row["name"]} works in the {row["department"]} department, and was born in {row["birthday month"]}.')
        line_count += 1
    print(f'Processed {line_count} lines.')

两种方法的最终输出结果一致。

Column names are name, department, birthday month John Smith works in the Accounting department, and was born in November. Erica Meyers works in the IT department, and was born in March. Processed 3 lines.

CSV Reader参数详解

reader对象允许指定附加参数,以处理不同格式的CSV文件。

delimiter:指定分隔字段的字符,默认为逗号(',')。

quotechar:指定用于包裹包含分隔符字段的字符,默认为双引号('"')。

escapechar:指定用于转义分隔符的字符(当不使用引号时),默认为无转义字符。

示例文件:employee_addresses.txt

name,address,date joined
john smith,1132 Anywhere Lane Hoboken NJ, 07030,Jan 4
erica meyers,1234 Smith Lane Hoboken NJ, 07030,March 2

该CSV文件包含三个字段:name、address和date joined,以逗号分隔。问题在于address字段的数据中包含表示邮政编码的逗号,导致解析歧义。

思考如何处理这种情况?

写入CSV文件

写入CSV文件可使用writer对象的write_row()方法(注:实际API为writerow)。

import csv

with open('employee_file.csv', mode='w') as employee_file:
    employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)

    employee_writer.writerow(['John Smith', 'Accounting', 'November'])
    employee_writer.writerow(['Erica Meyers', 'IT', 'March'])

quotechar用于包裹包含特殊字符的字段,以消除歧义。

quoting参数控制引号行为,有以下几种情况:

csv.QUOTE_NONNUMERIC:非数字字段加引号

csv.QUOTE_ALL:所有字段加引号

csv.QUOTE_MINIMAL:仅特殊字段加引号

csv.QUOTE_NONE:都不加引号

字典方式写入示例。

import csv

with open('employee_file2.csv', mode='w') as csv_file:
    fieldnames = ['emp_name', 'dept', 'birth_month']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'emp_name': 'John Smith', 'dept': 'Accounting', 'birth_month': 'November'})
    writer.writerow({'emp_name': 'Erica Meyers', 'dept': 'IT', 'birth_month': 'March'})

示例输出文件:employee_file2.csv

emp_name,dept,birth_month
John Smith,Accounting,November
Erica Meyers,IT,March

使用Pandas库解析CSV文件

Pandas是一个开源Python库,提供高性能的数据分析工具和易于使用的数据结构,支持数据共享、代码、分析结果、可视化和叙述性文本的集成。

Pandas读取CSV文件

示例文件:hrdata.csv

Name,Hire Date,Salary,Sick Days remaining
Graham Chapman,03/15/14,50000.00,10
John Cleese,06/01/15,65000.00,8
Eric Idle,05/12/14,45000.00,10
Terry Jones,11/01/13,70000.00,3
Terry Gilliam,08/12/14,48000.00,7
Michael Palin,05/23/13,66000.00,8

使用Pandas可以迅速读取数据。

import pandas
df = pandas.read_csv('hrdata.csv')
print(df)

             Name Hire Date   Salary  Sick Days remaining
0  Graham Chapman  03/15/14  50000.0                   10
1     John Cleese  06/01/15  65000.0                    8
2       Eric Idle  05/12/14  45000.0                   10
3     Terry Jones  11/01/13  70000.0                    3
4   Terry Gilliam  08/12/14  48000.0                    7
5   Michael Palin  05/23/13  66000.0                    8

使用Pandas读取数据时,可以格式化日期格式。

import pandas
df = pandas.read_csv('hrdata.csv', index_col='Name', parse_dates=['Hire Date'])
print(df)
                Hire Date   Salary  Sick Days remaining
Name                                                   
Graham Chapman 2014-03-15  50000.0                   10
John Cleese    2015-06-01  65000.0                    8
Eric Idle      2014-05-12  45000.0                   10
Terry Jones    2013-11-01  70000.0                    3
Terry Gilliam  2014-08-12  48000.0                    7
Michael Palin  2013-05-23  66000.0                    8

Pandas写入CSV文件

读取到Pandas的数据框可以直接写入新的CSV文件。

import pandas
df = pandas.read_csv('hrdata.csv', 
            index_col='Employee', 
            parse_dates=['Hired'],
            header=0, 
            names=['Employee', 'Hired', 'Salary', 'Sick Days'])
df.to_csv('hrdata_modified.csv')

print(df)
Employee,Hired,Salary,Sick Days
Graham Chapman,2014-03-15,50000.0,10
John Cleese,2015-06-01,65000.0,8
Eric Idle,2014-05-12,45000.0,10
Terry Jones,2013-11-01,70000.0,3
Terry Gilliam,2014-08-12,48000.0,7
Michael Palin,2013-05-23,66000.0,8

以上即为Pandas对CSV文件读写操作的详细解析,更多关于Pandas读写CSV的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。