2015-04-17 3 views
0

У меня есть строка, как это:Разделить строку запятой, игнорируя запятую внутри строки. Пытаюсь CSV

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

И я хочу, чтобы включить его в список:

[1,2,"hello, there"] 

Обычно я использовать раскол:

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

Вы пробовали регулярное выражение? – Dudemanword

+0

, где вы узнали, что вам нужно использовать csv для разделения строки? –

+0

@ user984003, пожалуйста, примите один или несколько ответов, которые решают вашу проблему. – gabe

ответ

1

Это звучит, как вы, вероятно, хотите использовать csv модуль. Чтобы использовать читатель в строке, вам нужен объект StringIO.

В качестве примера:

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

Чтобы уточнить, csv.reader ожидает, что буфер объекта, а не строка. Итак, StringIO делает трюк. Однако, если вы читаете этот csv из файлового объекта (типичный пример использования), вы можете так же легко передать объект файла читателю, и он будет работать одинаково.

+1

почему вниз? Я думаю, что это работает – galaxyan

+0

Это похоже на работу, спасибо! Кто-нибудь хочет сказать мне, почему это было приостановлено? Он превращает int в строки, но я в порядке с этим. – user984003

+0

Вы можете использовать любое итеративное, на самом деле: список или кортеж будут работать так же хорошо. –

1

Обычно легче использовать, чем изобретать велосипед ... Вы просто используете csv library должным образом. Если по какой-то причине вы не можете, вы всегда можете проверить исходный код и узнать, как выполняется синтаксический анализ.

Пример для синтаксического анализа одной строки в списке. Обратите внимание, что строка, заключенная в список.

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

Я думаю, вы имеете в виду csv, и OP уже использует его –

+0

Спасибо, что указали его. По-видимому, я не был первым с этим ответом. Мне немного странно использовать SO мобильное приложение. –

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']] 
+0

Вы указываете StringIO и файл, но на самом деле используете список в своем примере. Вы можете использовать любую итерабельную там: список или кортеж будут работать так же хорошо. –

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, если это то, с чем вы работаете.

0

Вы также можете использовать ast.literal_eval, если вы хотите сохранить целые числа:

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