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

2024-09-28 22:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

检查名称返回:

^{pr2}$

我可以忽略所有奇怪的条目,保留0,2,4,…,但我不明白我做错了什么,为什么 逗号作为条目保留。我要做些什么才能去掉逗号呢IsDeleted'应该是第二个条目(names[1])

提前谢谢。在


Tags: 模块csvnameidnames方式条目firstname
2条回答

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

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

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

下一个'line'包含一个逗号,两个空值。在

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

  • 迭代并接收"。这是一个带引号的值,所以包括行尾的所有内容。在
  • 有一个左引号,迭代直到找到一个右引号,直到该点被附加到现有值。
    • 循环并接收I,追加。在
    • 循环并接收d,追加。在
    • 循环并接收"。引号结束,生成一个完整的行['Id']。在
  • 迭代并接收,。这是一个带有分隔符的完整行,因此要生成['', '']。在

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

^{pr2}$

我在换行符中保留(传入True到{};带新行的引号将正确返回,并包含新行。在

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

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

Return a reader object which will iterate over lines in the given csvfile. csvfile can be any object which supports the iterator protocol and returns a string each time its next() method is called — file objects and list objects are both suitable.

一种选择是将字符串读入StringIO缓冲区:

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

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

^{pr2}$

相关问题 更多 >