摘要这一篇介绍关于python读取和写入csv文件, 包含csv文件的简单介绍, csv中参数的解释, 例如quoting的含义等.
简介
在做数据处理的时候, 大部分的特征数据会存为csv格式的文件, 这里我们就介绍一下csv这个包的使用, 这是python一个内置的处理csv的库.
参考资料
什么是csv文件
csv是一种plain text file, 使用特殊的结构来存储表格数据. csv文件的格式由他的名字给出, CSV files use a comma(逗号) to separate(分割) each specific data value(数据).
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
...
the first line identifies each piece of data—in other words, the name of a data column
each piece of data is separated by a comma
下面介绍一些名字, 在使用csv的时候设置参数的时候会用到:
分隔符除了上面的逗号之外, 还会有一些其他的. The separator character is called a delimiter(分隔符), and the comma is not the only one used. Other popular delimiters include the tab (\t), colon (:) and semi-colon (;) characters.
CSV库的介绍
上面介绍完csv文件的内容, 下面来看一下如何使用csv库来处理csv文件.
从csv文件中读取内容
这里我们使用csv库来完成, 但是读取我个人还是会喜欢使用pandas来进行处理. 读取使用reader object. 我们会首先使用python内的with open打开文件, 接着初始化一个reader来处理csv文件.
我们首先来看一下reader的参数:
delimiter specifies the character used to separate each field. The default is the comma (','). 分隔符
quotechar specifies the character used to surround fields that contain the delimiter character. The default is a double quote (' " '). 如果在一些内容里也包含分隔符, 但其实他不是作为分隔符使用, 那么可以使用指定的符号进行包裹, 这个就叫做quotechar.
escapechar specifies the character used to escape the delimiter character, in case quotes aren't used. The default is no escape character. 转意字符
假设我们的csv的文件如下所示, 下面第二行的March中有逗号, 所以我们需要使用双引号把他框起来:
John Smith,Accounting,November
Erica Meyers,IT,"Ma,rch"
Erica Meyers,IT,March
Erica Meyers,IT,March
Erica Meyers,IT,March
我们使用reader进行处理, 并打印出每一行的内容和类型.
import csv
with open('employee_file.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',', quotechar='"')
line_count = 0
for row in csv_reader:
print('row:{}, type row:{}'.format(row, type(row)))
line_count += 1
print(f'Processed {line_count} lines.')
最终的结果如下所示, 可以看到在读取的时候每一行会变为一个list, 根据我们设置的delimiter来进行分割:
row:['John Smith', 'Accounting', 'November'], type row:
row:['Erica Meyers', 'IT', 'Ma,rch'], type row:
row:['Erica Meyers', 'IT', 'March'], type row:
row:['Erica Meyers', 'IT', 'March'], type row:
row:['Erica Meyers', 'IT', 'March'], type row:
Processed 5 lines.
csv文件写入
上面介绍了读取csv文件, 接着我们介绍如何写入csv文件. 写入的方法是使用writerow来进行写入. 下面是一个简单的写入的例子.
import csv
with open('employee_file.csv', mode='w', newline='') 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'])
employee_writer.writerow(['Erica Meyers', 'IT', 'March'])
我们介绍一下写入的时候, 使用到的quoting这个参数, 这个参数就是表示是否使用引号把每一部分框起来:
If quoting is set to csv.QUOTE_MINIMAL, then .writerow() will quote fields only if they contain the delimiter or the quotechar. This is the default case. (只在出现有分割符或是换行的时候增加引号)
If quoting is set to csv.QUOTE_ALL, then .writerow() will quote all fields. 所有的都增加引号.
If quoting is set to csv.QUOTE_NONNUMERIC, then .writerow() will quote all fields containing text data and convert all numeric fields to the float data type.
If quoting is set to csv.QUOTE_NONE, then .writerow() will escape delimiters instead of quoting them. In this case, you also must provide a value for the escapechar optional parameter.
我们就来看一下上面QUOTE_MINIMAL和QUOTE_ALL的区别.
首先是QUOTE_MINIMAL的时候, 只有第二行的March有双引号, 这是因为其中包含逗号:
John Smith,Accounting,November
Erica Meyers,IT,"Mar,ch"
Erica Meyers,IT,March
Erica Meyers,IT,March
Erica Meyers,IT,March
接着来看一下QUOTE_ALL的时候的结果, 可以看到此时每一个都被双引号包住了.
"John Smith","Accounting","November"
"Erica Meyers","IT","Mar,ch"
"Erica Meyers","IT","March"
"Erica Meyers","IT","March"
"Erica Meyers","IT","March"
可能存在的问题
writerow后有空白行
我们有的时候使用writerow的时候, 会发现每一行下面都有一个空白行, 如下所示:
这是因为我们在使用的时候没有指定newline, 如下所示, 是没有指定的:
with open('employee_file.csv', mode='w') as employee_file:
我们可以按照下面的方式增加指定的newline就可以了.
with open('output.csv', 'w', newline='') as f:
writer = csv.writer(f)
...
设置newlinw='\n'也是可以的. 就像下面这样.
with open('output.csv', 'w', newline='\n', encoding='utf-8') as f:
writer = csv.writer(f)
...
最终的结果如下所示, 此时就没有空行了: