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
,...