Читайте в кортеже списков из текстового файла как кортеж, а не строку - Python - PullRequest
7 голосов
/ 28 января 2011

У меня есть текстовый файл, в котором я хотел бы прочитать, который содержит строки кортежей. Каждый кортеж / строка в тексте имеет вид («строка описания», [список целых чисел 1], [список целых чисел 2]). Где текстовый файл может выглядеть примерно так:

('пункт 1', [1,2,3,4], [4,3,2,1])
('пункт 2', [], [4,3,2,1])
('пункт 3, [1,2], [])

Я хотел бы иметь возможность прочитать каждую строку из текстового файла, а затем поместить их непосредственно в функцию, где

function(string, list1, list2)

Я знаю, что каждая строка читается как строка, но мне нужно как-то извлечь эту строку. Я пытался использовать string.split (','), но у меня возникают проблемы при попадании в списки. Есть ли способ сделать это или мне придется как-то изменить мои текстовые файлы?

У меня также есть текстовый файл со списком кортежей, который я хотел бы прочитать аналогичным образом, в виде

[(1,2), (3,4), (5,6), ...]

, который может содержать любое количество кортежей. Я хотел бы прочитать его в списке и сделать цикл для каждого кортежа в списке. Я полагаю, что эти два будут использовать примерно один и тот же процесс.

Ответы [ 3 ]

20 голосов
/ 28 января 2011

Вы ищете ast.literal_eval().

>>> ast.literal_eval("('item 1', [1,2,3,4] , [4,3,2,1])")
('item 1', [1, 2, 3, 4], [4, 3, 2, 1])
13 голосов
/ 28 января 2011

Как насчет использования eval?

РЕДАКТИРОВАТЬ См. Ответ @ Игнасио, используя ast.literal_eval.

>>> c = eval("('item 1', [1,2,3,4] , [4,3,2,1])")
>>> c
('item 1', [1, 2, 3, 4], [4, 3, 2, 1])

Я бы рекомендовал делать это только в том случае, если вы на 100% уверены в содержании файла.

>>> def myFunc(myString, myList1, myList2):
...     print myString, myList1, myList2
... 
>>> myFunc(*eval("('item 1', [1,2,3,4] , [4,3,2,1])"))
item 1 [1, 2, 3, 4] [4, 3, 2, 1]

См. Ответ @ Игнасио ... намного, намного безопаснее.

Применение астмы даст:

>>> import ast
>>> def myFunc(myString, myList1, myList2):
...     print myString, myList1, myList2
... 
>>> myFunc(*ast.literal_eval("('item 1', [1,2,3,4] , [4,3,2,1])"))
item 1 [1, 2, 3, 4] [4, 3, 2, 1]
1 голос
/ 29 января 2011

Возможно, вы также захотите взглянуть на модуль pickle для сохранения объектов Python в текстовые файлы и последующего их чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...