文章目录(Table of Contents)
简介
在做数据处理的时候, 大部分的特征数据会存为csv格式的文件, 这里我们就介绍一下csv这个包的使用, 这是python一个内置的处理csv的库.
参考资料
- csv包的官方说明: csv — CSV File Reading and Writing
- 解决空白行的问题: CSV in Python adding an extra carriage return, on Windows
- 这一篇的主要参考资料: Reading and Writing CSV Files in Python
什么是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的参数:
delimiterspecifies the character used to separate each field. The default is the comma (','). 分隔符quotecharspecifies the character used to surround fields that contain the delimiter character. The default is a double quote (' " '). 如果在一些内容里也包含分隔符, 但其实他不是作为分隔符使用, 那么可以使用指定的符号进行包裹, 这个就叫做quotechar.escapecharspecifies 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:<class 'list'>
- row:['Erica Meyers', 'IT', 'Ma,rch'], type row:<class 'list'>
- row:['Erica Meyers', 'IT', 'March'], type row:<class 'list'>
- row:['Erica Meyers', 'IT', 'March'], type row:<class 'list'>
- row:['Erica Meyers', 'IT', 'March'], type row:<class 'list'>
- 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
quotingis set tocsv.QUOTE_MINIMAL, then.writerow()will quote fields only if they contain thedelimiteror thequotechar. This is the default case. (只在出现有分割符或是换行的时候增加引号) - If
quotingis set tocsv.QUOTE_ALL, then.writerow()will quote all fields. 所有的都增加引号. - If
quotingis set tocsv.QUOTE_NONNUMERIC, then.writerow()will quote all fields containing text data and convert all numeric fields to thefloatdata type. - If
quotingis set tocsv.QUOTE_NONE, then.writerow()will escape delimiters instead of quoting them. In this case, you also must provide a value for theescapecharoptional 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)
- ...
最终的结果如下所示, 此时就没有空行了:
参考资料: CSV in Python adding an extra carriage return, on Windows
- 微信公众号
- 关注微信公众号
-
- QQ群
- 我们的QQ群号
-












评论