Чтение текстового документа, содержащего список Python, в программу Python - PullRequest
0 голосов
/ 18 октября 2018

У меня есть текстовый файл (dummy.txt), который выглядит следующим образом:

['abc',1,1,3,3,0,0]
['sdf',3,2,5,1,3,1]
['xyz',0,3,4,1,1,1]

Я ожидаю, что это будет в списках в Python, как показано ниже:

article1 = ['abc',1,1,3,3,0,0]
article2 = ['sdf',3,2,5,1,3,1]
article3 = ['xyz',0,3,4,1,1,1]

Это многостатьи должны быть созданы как можно больше строк в dummy.txt

Я пытался сделать следующее: открыл файл, разделил его на '\ n' и добавил в пустой список на python, он имел дополнительныйпоэтому кавычки и квадратные скобки пытались использовать «ast.literal_eval», который также не работал.

my_list = []
fvt = open("dummy.txt","r")
for line in fvt.read():
    my_list.append(line.split('\n'))
    my_list = ast.literal_eval(my_list)

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

Ответы [ 5 ]

0 голосов
/ 18 октября 2018

Попробуйте это split (импорт не требуется) (я рекомендую):

with open('dummy.txt','r') as f:
    l=[i[1:-1].strip().replace("'",'').split(',') for i in f]

Сейчас:

print(l)

Is:

[['abc', 1, 1, 3, 3, 0, 0], ['sdf', 3, 2, 5, 1, 3, 1], ['xyz', 0, 3, 4, 1, 1, 1]]

Asожидается !!!

0 голосов
/ 18 октября 2018

Когда я делаю это:

import ast
x = '[ "A", 1]'
x = ast.literal_eval(x)
print(x)

Я получаю:

 ["A", 1]

Итак, ваш код должен быть:

for line in fvt.read():
    my_list.append(ast.literal_eval(line))
0 голосов
/ 18 октября 2018

fvt.read() создаст всю строку файла, так что line будет содержать одну строку символов.Так что это будет работать не очень хорошо, вы также используете literal_eval(..) со всем списком строк, а не с одной строкой.

Вы можете получить результаты, перебирая обработчик файла и каждый раз вызывая literal_eval(..) на одном line:

from ast import literal_eval

with open("dummy.txt","r") as f:
    my_list = [literal_eval(line) for line in f]

или с помощью map:

from ast import literal_eval

with open("dummy.txt","r") as f:
    my_list = list(map(literal_eval, f))

Затем получим:

>>> my_list
[['abc', 1, 1, 3, 3, 0, 0], ['sdf', 3, 2, 5, 1, 3, 1], ['xyz', 0, 3, 4, 1, 1, 1]]
0 голосов
/ 18 октября 2018

ast.literal_eval - правильный подход.Обратите внимание, что создание переменного числа переменных , например article1, article2, ... не очень хорошая идея.Вместо этого используйте словарь, если ваши имена значимы, в противном случае список.

Как Виллем упомянул в его ответ fvt.read(), вы получите весь файл в виде одной строки.Намного легче использовать тот факт, что файлы итерируемые построчно.Продолжайте цикл for, но избавьтесь от вызова на read.

Кроме того,

my_list = ast.literal_eval(my_list)

проблематично, потому что a) вы оцениваете неправильную структуру данных - вы хотитеоцените строку, , а не список my_list, к которому вы добавляете и b) потому что вы переназначаете имя my_list, в этот момент старый my_list исчез.

Рассмотримследующая демка.(Замените fake_file на фактический файл, который вы открываете.)

>>> from io import StringIO
>>> from ast import literal_eval
>>> 
>>> fake_file = StringIO('''['abc',1,1,3,3,0,0]
... ['sdf',3,2,5,1,3,1]
... ['xyz',0,3,4,1,1,1]''')
>>> result = [literal_eval(line) for line in fake_file]
>>> result
[['abc', 1, 1, 3, 3, 0, 0], ['sdf', 3, 2, 5, 1, 3, 1], ['xyz', 0, 3, 4, 1, 1, 1]]

Конечно, вы также можете использовать словарь для хранения оцененных строк:

>>> result = {'article{}'.format(i):literal_eval(line) for i, line in enumerate(fake_file, 1)}
>>> result
{'article2': ['sdf', 3, 2, 5, 1, 3, 1], 'article1': ['abc', 1, 1, 3, 3, 0, 0], 'article3': ['xyz', 0, 3, 4, 1, 1, 1]}

там, где вы сейчасможет выдавать

>>> result['article2']
['sdf', 3, 2, 5, 1, 3, 1]

... но поскольку эти имена не очень значимы, я бы просто пошел за списком, который вы можете индексировать с помощью 0, 1, 2,...

0 голосов
/ 18 октября 2018

Это должно помочь.

import ast

myLists = []
with open(filename) as infile:
    for line in infile:                         #Iterate Each line
        myLists.append(ast.literal_eval(line))  #Convert to python object and append.
print(myLists)  

Вывод:

[['abc', 1, 1, 3, 3, 0, 0], ['sdf', 3, 2, 5, 1, 3, 1], ['xyz', 0, 3, 4, 1, 1, 1]]
...