用逗号分割字符串,忽略字符串中的逗号。我正在尝试CSV

时间:2015-04-17 21:45:02

标签: python csv

我有一个这样的字符串:

s = '1,2,"hello, there"'

我想把它变成一个列表:

[1,2,"hello, there"]

通常我会使用split:

my_list = s.split(",") 

但是,如果字符串中有逗号,则不起作用。

所以,我读过我需要使用cvs,但我真的不知道怎么做。我试过了:

from csv import reader
s = '1,2,"hello, there"'
ll = reader(s)
print ll 
for row in ll:
    print row

写道:

<_csv.reader object at 0x020EBC70>

['1']
['', '']
['2']
['', '']
['hello, there']

我也试过

ll = reader(s, delimiter=',')

5 个答案:

答案 0 :(得分:2)

就是这样,因为你提供了csv阅读器输入作为字符串。如果您不想使用文件或StringIO对象,只需将字符串包装在列表中,如下所示。

>>> import csv
>>> s = ['1,2,"hello, there"']
>>> ll = csv.reader(s, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
>>> list(ll)
[['1', '2', 'hello, there']]

答案 1 :(得分:1)

听起来您可能想要使用csv模块。要在字符串上使用阅读器,您需要一个StringIO对象。

举个例子:

>> import csv, StringIO
>> print list(csv.reader(StringIO.StringIO(s)))
[['1', '2', 'hello, there']]

为了澄清,csv.reader需要缓冲区对象,而不是字符串。所以StringIO就可以了。但是,如果您从文件对象(一个典型的用例)中读取此csv,您可以轻松地将文件对象提供给阅读器,并且它将以相同的方式工作。

答案 2 :(得分:1)

通常比重新发明自行车更容易重复使用......您只需正确使用csv library即可。如果由于某种原因你无法做到,你可以随时查看源代码,并了解如何在那里完成解析。

将单个字符串解析为列表的示例。请注意,字符串包含在列表中。

>>> import csv
>>> s = '1,2,"hello, there"'
>>> list(csv.reader([s]))[0]
['1', '2', 'hello, there']

答案 3 :(得分:0)

你可以先用字符串分隔符拆分,然后用逗号分隔每个偶数索引(不在字符串中的那些)

import itertools

new_data = s.split('"')
for i in range(len(new_data)):
    if i % 2 == 1: # Skip odd indices, making them arrays
       new_data[i] = [new_data[i]]
    else:
        new_data[i] = new_data[i].split(",")
data = itertools.chain(*new_data)

这就像是:

'1,2,"hello, there"'
['1,2,', 'hello, there']
[['1', '2'], ['hello, there']]
['1', '2', 'hello, there']

但如果你正在使用它,那么使用csv库可能会更好。

答案 4 :(得分:0)

如果要保留整数,也可以使用ast.literal_eval

>>> from ast import literal_eval
>>> literal_eval('[{}]'.format('1,2,"hello, there"'))
[1, 2, 'hello, there']