2015-11-27 2 views
2

Новый для python. Я читаю из файла построчно:Python синтаксический анализ строк из файла

with open("graph.txt", "r") as f: 
    comList = f.readlines() 
    print(comList) 
    edge_u = [x[0] for x in comList] 
    edge_v = [x[1] for x in comList] 

graph.txt имеет:

[(0, 7), (1, 9), (1, 9), (2, 0)]

[(2, 1), (2, 1), (3, 6)]

Я ожидал, что readlines будет разбирать файл построчно, следовательно, будет анализировать текст в виде списка список. Но его разбор его как Список строк. Следовательно, i; m не может выполнять другие две операции. Попробовал распечатать edge_u и узнать, что его разбор. Как с этим бороться? Благодарю.

ответ

4

Вы можете попробовать это:

import ast 

with open("test.txt", "r") as f: 
    for line in f: 
     li = ast.literal_eval(line) 
     edge_u = [x[0] for x in li] 
     edge_v = [x[1] for x in li] 
+1

@ user2754673, вам не нужно закрывать файл, если вы открываете его с помощью 'with'. – pythad

+0

Работал как шарм ,, !! Благодарю. – user2754673

+0

'для строки в f.readlines()' избыточно. 'для строки, если f' - это все, что вам нужно. –

0

Вы можете использовать eval, но будьте осторожны, чтобы не поймать что-то исключительное:

In [1]: tmp = eval("[(0, 7), (1, 9), (1, 9), (2, 0)]") 
In [2]: tmp 
Out[2]: [(0, 7), (1, 9), (1, 9), (2, 0)] 

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

+0

спасибо за помощь. – user2754673

1

file.readlines([size]) возвращает размер байтов строк или всех строк в виде списка строк. Я считаю, что вы хотите, если вы хотите проанализировать этот файл, будет json.

from json import loads 

with open('graph.txt', 'r') as fob: 
    comList = [loads(line) for line in fob] 

edge_u = [x[0] for x in comList] 
edge_v = [x[1] for x in comList] 
+0

Ваш код не работает с данным вводом. 'ValueError: Ожидающее значение: строка 1 столбец 2 (char 1)' – Pynchia

+0

Извините, должен работать сейчас, запутался :) – OnGle

+0

такой же результат, к сожалению, – Pynchia

0

Как уже предложил, вы можете использовать eval

with open("graph.txt","r") as f: 
     lines = f.readlines() 
     comList = list(map(eval, lines)) 
     print(type(comList), comList) 
     edge_u = [x[0] for x in comList] 
     edge_v = [x[1] for x in comList] 

print(type(edge_u), edge_u) 
print(type(edge_v), edge_v) 

, который производит

<class 'list'> [[(0, 7), (1, 9), (1, 9), (2, 0)], [(0, 7), (1, 9), (1, 9), (2, 0)]] 
<class 'list'> [(0, 7), (0, 7)] 
<class 'list'> [(1, 9), (1, 9)] 
Смежные вопросы