2

我以以下方式使用 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])

提前致谢。

4

2 回答 2

4

csv.reader()可以处理任何可迭代对象,并期望在该可迭代对象上的每次迭代都产生一个完整的行。可迭代对象可以是类似文件的对象,或者(通常)是字符串列表

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

如果传入一个字符串对象,则字符串本身会被迭代,就好像每个字符都是一行一样,但由于引号csv将继续读取“行”,直到找到一个右引号字符。

下一个“行”包含一个逗号,因此它被视为包含两个空值的行。

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

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

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

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

我留在换行符中(传递Truestr.splitlines(); 然后正确返回带有换行符的引用值并包含换行符。

于 2013-09-06T17:18:58.040 回答
3

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

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

返回一个读取器对象,它将遍历给定 csvfile 中的行。csvfile 可以是任何支持迭代器协议并在每次调用其 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']]
于 2013-09-06T17:15:48.553 回答