2014-06-25 7 views
0

У меня есть файл, из которого в каждой строке содержится следующее: имя файла, длина списка, фактический список. Вот пример:Прочитать список из файла в python

a.txt 3 [4,2,9] 
b.txt 5 [1,6,5,2,8] 
c.txt 7 [1,2,3,4,5,6,7] 

и так далее. Мне удалось прочитать все до списка, но список читается как строки. Например, для первого, выход '[4,','3,','4]', и я хочу иметь обычный список. Это код, который я до сих пор, но это только простое чтение из файла:

f = open('example.txt', 'r') 
for eachLine in f: 
    a = eachLine.strip().split() 
    l = a[2] 
print l 
f.close() 

Я использовал l=a[2], но это не хранит весь свой список, он хранит только первый элемент из него.

Как сохранить список из файла в список на python?

+0

Вы должны оценить список как список питона для этого вы можете использовать [ast.literal_eval] (https://docs.python.org/2/library/ast. html # ast.literal_eval) –

+0

Если вы действительно хотите упростить и добавить гибкость, вы можете использовать [pickle] (https://docs.python.org/2/library/pickle.html) для сериализации ваших данных. Тогда загрузка ваших данных будет такой же простой, как 'pickle.load (f)'. Вам нужно будет сделать некоторую конвертацию и сохранить все данные как pickle вместо текущего формата. – msvalkon

+0

Есть ли пространство между элементами списка? Попробуйте '.split (maxsplit = 2)'. – jonrsharpe

ответ

2
with open('example.txt', 'r') as f: 
    for eachLine in f:           
     a = eachLine.strip().split(" ",2)       
     req_list = [int(x) for x in a[2].strip('[]').split(',')] 
     print req_list           

выход:

[4, 2, 9] 
[1, 6, 5, 2, 8] 
[1, 2, 3, 4, 5, 6, 7] 
+0

Это будет работать, но 'l = a [2]' не сохраняет весь список. Я отредактировал свой вопрос, чтобы включить этот факт. – user1956190

+0

@ пользователь1956190, я не понимаю. Я протестировал это, и он работает –

+0

Назначение 'l = a [2]' возвращает только первый элемент из списка. Например, '[4,'. Он только читает элементы из списка один за другим. – user1956190

-1

Вы можете использовать Eval:

eval('[4,3,4]') 

возвращает список [4,3,4]

+4

Это не рекомендуется, если есть, то вы можете использовать [ast.literal_eval()] (http://stackoverflow.com/a/15197698/1982962) –

0

Вы можете использовать функцию Eval следующим образом:

with open('example.txt', 'r') as f: 
    for eachLine in f: 
     tokens = eachLine.strip().split() 
     theLen = int(tokens[0]) 
     theList = eval(tokens[1]) 

Будьте осторожны при использовании Eval Однако. Если вы читаете данные из ненадежного источника, они могут делать неприятные вещи, передавая в файл с произвольным кодом python.

Если возможно, вы должны использовать формат файла, например json, для чтения/записи простых структур данных на диск, поскольку эти форматы уже имеют надежную де-сериализацию для защиты от таких атак.

+1

То же, что и Jeff answer eval не рекомендуется, так как это может быть небезопасный вид [ здесь] (http://stackoverflow.com/a/15197698/1982962) –

+1

Уверен, что это может быть небезопасно, но иногда эти вещи существуют в безопасной среде, и использование eval является вполне жизнеспособным вариантом. Без контекста к проблеме его трудно узнать. В идеале вы будете использовать json или какой-либо другой уже существующий формат файла, который устраняет эти проблемы. – Hamish

+0

Да, но поскольку вам не хватает деталей, рекомендующих «eval», это не лучший способ ответить на этот вопрос. –

1

Solution без использования Eval.

with open('input.txt', 'r') as f: 
    for eachLine in f: 
     a = eachLine.strip().split() 
     l = list(int(x) for x in a[2][1:-1].replace(',',"")) 
     print l 

ВЫВОД

[4, 2, 9] 
[1, 6, 5, 2, 8] 
[1, 2, 3, 4, 5, 6, 7] 
Смежные вопросы