2013-08-31 3 views
4

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

(0, 0), (0, 2), (0, 4), (-1, -1), (0, -2), (1, - 1), (-1, -3),

(-1, 1), (-1, 3), (1, 1), (1, 3), (1, 5), (2, 0), (2, 2), (3, 3),

(2, 4), (3, 5), (4, 4), (5, 3), (6, 4), (5, 5), (7, 5)

После прочтения из этого файла, мне нужно кортеж так:

G = ((0, 0), (0, 2), (0, 4), (-1, -1), (0, -2), (1, -1), (-1, -3), \ 
(-1, 1), (-1, 3), (1, 1), (1, 3), (1, 5), (2, 0), (2, 2), (3, 3), \ 
(2, 4), (3, 5), (4, 4), (5, 3), (6, 4), (5, 5), (7, 5)) 

Как это можно сделать эффективно? С уважением.

ответ

12

Поскольку они выглядят как правильные кортежи python, вы можете использовать literal_eval. Его быстрота в безопасности:

Безопасное оценивание узла выражения или строки, содержащей выражение Python . Представленная строка или узел могут состоять только из следующих Литеральные структуры Python: строки, числа, кортежи, списки, dicts, booleans, и None.

import ast 
s = '''(0, 0), (0, 2), ...''' 
result = ast.literal_eval('({0})'.format(s)) 
+0

Похоже, что OP хочет кортеж, а не список. Есть ли причина, по которой вы используете '' [{0}] ''вместо'' {0} ''или'' ({0}) ''? – SethMMorton

+0

@SethMMorton Да, нет, не внимательно прочитав вопрос: D ''{0}'' не работает, если строка является многострочной. Спасибо, что заметили. :) –

6

Предполагая, что есть file.txt со следующим содержанием:

(0, 0), (0, 2), (0, 4), (-1, -1), (0, -2), (1, -1), (-1, -3) 
(-1, 1), (-1, 3), (1, 1), (1, 3), (1, 5), (2, 0), (2, 2), (3, 3), 
(2, 4), (3, 5), (4, 4), (5, 3), (6, 4), (5, 5), (7, 5) 

Вы можете использовать literal_eval() на каждой строке в цикле и расширить полученный список:

from ast import literal_eval 

result = [] 
with open('file.txt', 'r') as f: 
    for line in f: 
     result.extend(literal_eval(line.strip())) 

print result 

печатает:

[(0, 0), (0, 2), (0, 4), (-1, -1), (0, -2), (1, -1), (-1, -3), (-1, 1), (-1, 3), (1, 1), (1, 3), (1, 5), (2, 0), (2, 2), (3, 3), (2, 4), (3, 5), (4, 4), (5, 3), (6, 4), (5, 5), (7, 5)] 

FYI, literal_eval() безопасен:

Безопасно оценить узел экспрессии или строку, содержащую выражение Python . Представленная строка или узел могут состоять только из следующих строковых литералов Python: строки, числа, кортежи, списки, dicts, booleans и None.

Надеюсь, что это поможет.