python读取csv文件-csv包的使用

  • A+
所属分类:Python库介绍
摘要这一篇介绍关于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的数据格式可能如下所示:

  1. column 1 name,column 2 name, column 3 name
  2. first row data 1,first row data 2,first row data 3
  3. second row data 1,second row data 2,second row data 3
  4. ...
  • 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中有逗号, 所以我们需要使用双引号把他框起来:

  1. John Smith,Accounting,November
  2. Erica Meyers,IT,"Ma,rch"
  3. Erica Meyers,IT,March
  4. Erica Meyers,IT,March
  5. Erica Meyers,IT,March

我们使用reader进行处理, 并打印出每一行的内容和类型.

  1. import csv
  2. with open('employee_file.csv') as csv_file:
  3.     csv_reader = csv.reader(csv_file, delimiter=',', quotechar='"')
  4.     line_count = 0
  5.     for row in csv_reader:
  6.         print('row:{}, type row:{}'.format(row, type(row)))
  7.         line_count += 1
  8.     print(f'Processed {line_count} lines.')

最终的结果如下所示, 可以看到在读取的时候每一行会变为一个list, 根据我们设置的delimiter来进行分割:

  1. row:['John Smith', 'Accounting', 'November'], type row:<class 'list'>
  2. row:['Erica Meyers', 'IT', 'Ma,rch'], type row:<class 'list'>
  3. row:['Erica Meyers', 'IT', 'March'], type row:<class 'list'>
  4. row:['Erica Meyers', 'IT', 'March'], type row:<class 'list'>
  5. row:['Erica Meyers', 'IT', 'March'], type row:<class 'list'>
  6. Processed 5 lines.

 

csv文件写入

上面介绍了读取csv文件, 接着我们介绍如何写入csv文件. 写入的方法是使用writerow来进行写入. 下面是一个简单的写入的例子.

  1. import csv
  2. with open('employee_file.csv', mode='w', newline='') as employee_file:
  3.     employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
  4.     employee_writer.writerow(['John Smith', 'Accounting', 'November'])
  5.     employee_writer.writerow(['Erica Meyers', 'IT', 'March'])
  6.     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有双引号, 这是因为其中包含逗号:

  1. John Smith,Accounting,November
  2. Erica Meyers,IT,"Mar,ch"
  3. Erica Meyers,IT,March
  4. Erica Meyers,IT,March
  5. Erica Meyers,IT,March

接着来看一下QUOTE_ALL的时候的结果, 可以看到此时每一个都被双引号包住了.

  1. "John Smith","Accounting","November"
  2. "Erica Meyers","IT","Mar,ch"
  3. "Erica Meyers","IT","March"
  4. "Erica Meyers","IT","March"
  5. "Erica Meyers","IT","March"

 

可能存在的问题

writerow后有空白行

我们有的时候使用writerow的时候, 会发现每一行下面都有一个空白行, 如下所示:

python读取csv文件-csv包的使用

这是因为我们在使用的时候没有指定newline, 如下所示, 是没有指定的:

  1. with open('employee_file.csv', mode='w') as employee_file:

我们可以按照下面的方式增加指定的newline就可以了.

  1. with open('output.csv', 'w', newline='') as f:
  2.     writer = csv.writer(f)
  3.     ...

设置newlinw='\n'也是可以的. 就像下面这样.

  1. with open('output.csv', 'w', newline='\n', encoding='utf-8') as f:
  2.     writer = csv.writer(f)
  3.     ...

最终的结果如下所示, 此时就没有空行了:

python读取csv文件-csv包的使用

参考资料CSV in Python adding an extra carriage return, on Windows

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: