python 读取csv_如何用Python读写CSV文件?

CSV文件是一种纯文本格式,用于存储表格数据,通常使用逗号作为分隔符。Python的csv库和pandas库提供了读取和写入CSV文件的方法。csv库允许逐行处理数据,而pandas则能更高效地分析大量数据,并自动处理数据类型。pandas的read_csv()函数可以轻松读取CSV文件,而to_csv()函数则用于将DataFrame写回CSV文件。
摘要由CSDN通过智能技术生成

什么是CSV文件?

CSV文件(逗号分隔值文件)是一种纯文本文件,它使用特定的结构来排列表格数据。因为它是纯文本文件,所以它只能包含实际的文本数据 - 换句话说,可以包含可打印的ASCII或Unicode字符。

CSV文件的结构由其名称给出。通常,CSV文件使用逗号分隔每个特定数据值。这是结构的样子: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

...

注意每个数据如何用逗号分隔。通常,第一行标识每条数据 - 换句话说,标识数据列的名称。之后的每个后续行都是实际数据,并且仅受文件大小限制的限制。

通常,分隔符称为分隔符,逗号不是唯一使用的分隔符。其他流行的分隔符包括tab(\t),冒号(:)和分号(;)字符。正确解析CSV文件需要我们知道正在使用哪个分隔符。

CSV文件来自哪里?

CSV文件通常由处理大量数据的程序创建。它们是从电子表格和数据库导出数据以及在其他程序中导入或使用数据的便捷方式。例如,您可以将数据挖掘程序的结果导出到CSV文件,然后将其导入电子表格以分析数据,生成演示文稿的图形或准备报告以供发布。

CSV文件非常易于以编程方式工作。任何支持文本文件输入和字符串操作的语言(如Python)都可以直接使用CSV文件。

使用Python的内置CSV库解析CSV文件

该csv库提供读取和写入CSV文件的功能。设计为使用Excel生成的CSV文件开箱即用,它可以轻松适应各种CSV格式。该csv库包含用于从CSV文件读取,写入和处理数据的对象和其他代码。

用CSV读取CSV文件 csv

使用该reader对象从CSV文件中读取。CSV文件作为文本文件打开,具有Python的内置open()函数,该函数返回文件对象。然后将其传递给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.')

这导致以下输出: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.

返回的每一行reader都是一个String元素列表,其中包含通过删除分隔符找到的数据。返回的第一行包含列名称,以特殊方式处理。

用CSV将CSV文件读入字典 csv

String您可以将CSV数据直接读入字典(技术上,也可以是有序字典),而不是处理单个元素列表。

我们的输入文件再次employee_birthday.txt如下:name,department,birthday month

John Smith,Accounting,November

Erica Meyers,IT,March

这是这次以字典形式阅读的代码: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文件的第一行包含用于构建字典的键。如果您的CSV文件中没有这些,则应通过将fieldnames可选参数设置为包含它们的列表来指定自己的密钥。

可选的Python 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字段的数据还包含一个逗号来表示邮政编码。

处理这种情况有三种不同的方法:使用不同的分隔符

这样,逗号可以安全地用在数据本身中。您可以使用delimiter可选参数指定新分隔符。

用引号括起数据

在引用的字符串中忽略所选分隔符的特殊性质。因此,您可以使用quotechar可选参数指定用于引用的字符。只要该字符也没有出现在数据中,你就可以了。

转义数据中的分隔符字符

Escape字符的工作方式与格式字符串中的相同,从而使转义字符的解释无效(在本例中为分隔符)。如果使用转义字符,则必须使用escapechar可选参数指定它。

用CSV编写CSV文件 csv

您还可以使用writer对象和.write_row()方法写入CSV文件: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可选参数告诉writer写作时要使用引号领域的字符。但是,是否使用引用,由quoting可选参数决定:如果quoting设置为csv.QUOTE_MINIMAL,则.writerow()仅当它们包含delimiter或时引用字段quotechar。这是默认情况。

如果quoting设置为csv.QUOTE_ALL,.writerow()则将引用所有字段。

如果quoting设置为csv.QUOTE_NONNUMERIC,.writerow()则将引用包含文本数据的所有字段,并将所有数字字段转换为float数据类型。

如果quoting设置为csv.QUOTE_NONE,.writerow()则将转义分隔符而不是引用它们。在这种情况下,您还必须为escapechar可选参数提供值。

以纯文本格式读回文件表明该文件创建如下:John Smith,Accounting,November

Erica Meyers,IT,March

用字典编写CSV文件 csv

由于您可以将我们的数据读入字典,因此您应该能够从字典中将其写出来是公平的: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'})

与此不同DictReader,fieldnames编写字典时需要参数。这是有道理的,当你想到它时:如果没有列表fieldnames,DictWriter就无法知道用哪些键从你的词典中检索值。它还使用键fieldnames将第一行写为列名。

上面的代码生成以下输出文件:emp_name,dept,birth_month

John Smith,Accounting,November

Erica Meyers,IT,March

使用pandas库解析CSV文件

当然,Python CSV库并不是城里唯一的游戏。也可以读取CSV文件pandas。如果您要分析大量数据,强烈建议使用。

pandas是一个开源Python库,提供高性能数据分析工具和易于使用的数据结构。pandas适用于所有Python安装,但它是Anaconda发行版的关键部分,在Jupyter笔记本中非常有效,可以共享数据,代码,分析结果,可视化和叙述文本。

安装pandas及其依赖项Anaconda很容易完成:$ conda install pandas

与使用pip/pipenv用于其他Python安装一样:$ pip install pandas

我们不会深入研究如何pandas工作或如何使用它的具体细节。有关使用pandas读取和分析大型数据集的深入处理,请查看Shantnu Tiwari关于使用pandas中的大型Excel文件的精湛文章。

用CSV读取CSV文件 pandas

为了展示pandasCSV功能的一些强大功能,我创建了一个稍微复杂的文件来读取,称为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

将CSV读入a pandas DataFrame是快速而直接的:import pandas

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

print(df)

就是这样:三行代码,其中只有一行正在进行实际工作。pandas.read_csv()打开,分析和读取提供的CSV文件,并将数据存储在DataFrame中。DataFrame在以下输出中打印结果: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认识到CSV的第一行包含列名,并自动使用它们。我称之为善良。

但是,pandas也使用了从零开始的整数索引DataFrame。那是因为我们没有告诉它我们的索引应该是什么。

此外,如果查看列的数据类型,您将看到pandas已将列Salary和Sick Days remaining列正确转换为数字,但Hire Date列仍然是String。这在交互模式下很容易确认:

>>>>>> print (type (df [ 'Hire Date' ] [ 0 ]))

让我们一次解决这些问题。要使用其他列作为DataFrame索引,请添加index_col可选参数:import pandas

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

print(df)

现在该Name字段是我们的DataFrame索引:Hire Date Salary Sick Days remaining

Name

Graham Chapman 03/15/14 50000.0 10

John Cleese 06/01/15 65000.0 8

Eric Idle 05/12/14 45000.0 10

Terry Jones 11/01/13 70000.0 3

Terry Gilliam 08/12/14 48000.0 7

Michael Palin 05/23/13 66000.0 8

接下来,让我们修复Hire Date字段的数据类型。您可以强制pandas使用parse_dates可选参数将数据读取为日期,可选参数定义为要作为日期处理的列名列表: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

现在日期格式正确,可以在交互模式下轻松确认:

>>>>>> print (type (df [ 'Hire Date' ] [ 0 ]))

如果CSV文件的第一行中没有列名,则可以使用namesoptional参数提供列名列表。如果要覆盖第一行中提供的列名,也可以使用此选项。在这种情况下,您还必须pandas.read_csv()使用header=0可选参数来忽略现有列名:import pandas

df = pandas.read_csv('hrdata.csv',

index_col='Employee',

parse_dates=['Hired'],

header=0,

names=['Employee', 'Hired','Salary', 'Sick Days'])

print(df)

请注意,由于列名称已更改,因此还必须更改在index_col和parse_dates可选参数中指定的列。现在这会产生以下输出:Hired Salary Sick Days

Employee

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

用CSV编写CSV文件 pandas

当然,如果你无法pandas再次获取数据,那对你的好处并不大。写入DataFrameCSV文件就像读取文件一样简单。让我们将带有新列名称的数据写入新的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)调用被替换为df.to_csv(),提供文件名。新的CSV文件如下所示: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值