Python CSV文件读写全指南:从内置csv库到Pandas实战
本文详细介绍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的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













