我有一个这样的字符串:
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=',')
答案 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']