使用Python导入CSV;不正确的“,”分隔符行为

时间:2013-09-06 17:10:57

标签: python csv

我正在以下列方式使用csv模块

header = '"Id","IsDeleted","MasterRecordId","Salutation","FirstName","LastName","Name","Type","RecordTypeId","ParentId","BillingStreet","BillingCity","BillingState","BillingPostalCode","BillingCountry","BillingLatitude"'
header_c = csv.reader(header, delimiter=',', quotechar='"')

names = []
for row in header_c:
  names.append(row)

检查姓名返回:

[['Id'], ['', ''], ['IsDeleted'], ['', ''], ['MasterRecordId'], ['', ''], ['Salutation'], ['', ''], ['FirstName'], ['', ''], ['LastName'], ['', ''], ['Name'], ['', ''], ['Type'], ['', ''], ['RecordTypeId'], ['', ''], ['ParentId'], ['', ''], ['BillingStreet'], ['', ''], ['BillingCity'], ['', ''], ['BillingState'], ['', ''], ['BillingPostalCode'], ['', ''], ['BillingCountry'], ['', ''], ['BillingLatitude']]

我可以忽略所有奇怪的条目,保持0,2,4 ......,但我不明白我做错了什么以及为什么 逗号被保留为条目。我需要更改什么才能删除逗号。 'IsDeleted'应该是第二个条目(名称[1])

提前致谢。

2 个答案:

答案 0 :(得分:4)

csv.reader()可以处理任何 iterable ,并期望对该iterable的每次迭代产生完整行。 iterable可以是类文件对象,或者(通常) list 字符串:

header_c = csv.reader([header], delimiter=',', quotechar='"')

如果传入只是单个字符串对象,则字符串本身会被迭代,就像每个字符都是一行一样,但由于引号csv将继续读取&# 39;线'直到它找到一个结束引号字符。

下一行'包含只是一个逗号,因此被视为一行两个空值。

或者,以前5个字符("Id",)为例,csv执行此操作:

  • 迭代并接收"。这是一个引用值,因此包括一直到行尾的所有内容。
  • 有一个开头报价,迭代直到找到结束报价,直到该点的所有内容都附加到现有值。
    • 循环并接收I,追加。
    • 循环并接收d,追加。
    • 循环并接收"。报价已关闭,产生一个完整的行['Id']
  • 迭代并接收,。这是一个带分隔符的完整行,因此产生['', '']

每当我需要将字符串值传递给csv.reader()时,我使用str.splitlines();此方法将始终返回一个列表,因此这适用于没有换行符的行:

header_c = csv.reader(header.splitlines(True), delimiter=',', quotechar='"')

我留在换行符中(将True传递给str.splitlines();然后使用换行符正确返回带引号的引号值。

答案 1 :(得分:3)

您应该将类​​文件对象(或任何其他可迭代对象)作为第一个参数传递给csv.reader

  

csv.reader(csvfile,dialect ='excel',** fmtparams)

     

返回一个读取器对象,它将迭代给定的行   csvfile。 csvfile可以是支持迭代器的任何对象   protocol并在每次调用next()方法时返回一个字符串 -   文件对象和列表对象都是合适的。

一个选项是将字符串读入StringIO缓冲区:

from StringIO import StringIO
header_c = csv.reader(StringIO(header), delimiter=',', quotechar='"')

然后,在名字中,你会得到:

[['Id', 'IsDeleted', 'MasterRecordId', 'Salutation', 'FirstName', 'LastName', 'Name', 'Type', 'RecordTypeId', 'ParentId', 'BillingStreet', 'BillingCity', 'BillingState', 'BillingPostalCode', 'BillingCountry', 'BillingLatitude']]