Python csv模块拆分字符串,而不仅仅是字段

时间:2016-01-05 05:32:11

标签: python string csv

当我运行此输入(保存为变量'line')时:

xsc_i,202,"House of Night",21,"/21_202"

通过csv阅读器:

for row in csv.reader(line):
    print row

它会分割字符串,而不仅仅是字段

['x']
['s']
['c']
['_']
['i']
['', '']
['2']
['0']
['2']
['', '']

即使我明确设置了分隔符,它也会出现这种行为:

csv.reader(line, delimiter=",")

它甚至将字符串视为数组,但我无法弄清楚为什么,我不能只用逗号分割,因为许多逗号都在输入中的“”字符串内。

Python 2.7,如果重要的话。

3 个答案:

答案 0 :(得分:6)

csv.reader()的第一个参数应该是一个包含csv行的可迭代对象。在您的情况下,输入是一个包含单行的字符串(也是可迭代的)。您需要将line括在一个列表中:

for row in csv.reader([line]):
    print row

演示:

>>> import csv
>>> line = 'xsc_i,202,"House of Night",21,"/21_202"'
>>> for row in csv.reader([line]):
...     print row
... 
['xsc_i', '202', 'House of Night', '21', '/21_202']

答案 1 :(得分:1)

以防您希望re正在使用中。

import re
line='xsc_i,202,"House of Night",21,"/21_202"'
print map(lambda x:x.strip('"'),re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)',line))

输出:['xsc_i', '202', 'House of Night', '21', '/21_202']

答案 2 :(得分:1)

这是因为csv.reader需要

  

任何支持迭代器协议并返回字符串的对象   每次调用next()方法

您已将字符串传递给读者。

如果你说:

line = ['xsc_i,202,"House of Night",21,"/21_202"',]

您的代码应该按预期工作。 请参阅docs