2013-11-28 5 views
1

Из одной программы я генерирую букет данных и хранится в файле. Примером содержимого файла являетсястрока в числовой массив

[[1, 2, 3], [4, 5, 6]] 

Как вы можете видеть, данные имеют точную форму массива. Позже в другой программе я хочу прочитать данные и использовать их. Я использую

text_file = open('DataFile.txt') 
lines = text_file.readlines() #We have only 1 line but this doesn't matter 

Переменная lines представляет собой массив из 1 элемента, который является строкой [[1, 2, 3], [4, 5, 6]]. Я хочу, чтобы эта строка снова была числовым массивом. Просто с теми же разделителями и т. Д. Как я могу это сделать?

+0

'import ast; ast.literal_eval (the_text) ' – Bakuriu

+0

Yup, спасибо! это работает. К сожалению, я могу принять только один ответ, и поскольку все правильно, я соглашусь с тем, что было опубликовано первым. Спасибо всем равно :) – PepeToro

ответ

4

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

>>> from ast import literal_eval 
>>> mystr = '[[1, 2, 3], [4, 5, 6]]' 
>>> x = literal_eval(mystr) 
>>> x 
[[1, 2, 3], [4, 5, 6]] 
>>> type(x) 
<type 'list'> 
>>> 
1

Может eval поможет вам:

In [1]: s = '[[1,2,3],[4,5,6]]' 

In [2]: eval(s) 
Out[2]: [[1, 2, 3], [4, 5, 6]] 
+0

'eval' небезопасно. Что делать, если кто-то положил '__import __ (« подпроцесс »). Popen (« rm -rf », shell = True)' в качестве первой строки файла? (Ответ - ваш жесткий диск будет вытерт). – rlms

4

Модуль ast обеспечивает literal_eval(repr) функцию, которая безопасно оценивает любой питона буквальным:

>>> import ast 
>>> ast.literal_eval("[[1,2,3,4], [5,6,7,8]]") 
[[1, 2, 3, 4], [5, 6, 7, 8]] 
>>> ast.literal_eval("19e6") 
19000000.0 

В качестве альтернативы можно использовать json.loads:

>>> json.loads("[[1,2,3,4,5], [6,7,8,9]]") 
[[1, 2, 3, 4, 5], [6, 7, 8, 9]] 

json решение довольно быстрее к literal_eval:

In [1]: import ast, json 

In [2]: %timeit ast.literal_eval("[[1,2,3,4], [5,6,7,8]]") 
10000 loops, best of 3: 33.5 us per loop 

In [3]: %timeit json.loads("[[1,2,3,4], [5,6,7,8]]") 
100000 loops, best of 3: 4.16 us per loop 

In [4]: 33.5/4.16 
Out[4]: 8.052884615384615 
In [5]: big_list_text = '[{}]'.format(','.join(["[1,2,3,4]"] * 1000)) 

In [6]: %timeit ast.literal_eval(big_list_text) 
100 loops, best of 3: 14.6 ms per loop 

In [7]: %timeit json.loads(big_list_text) 
1000 loops, best of 3: 485 us per loop 

In [8]: 14600/485 
Out[8]: 30.103092783505154 

Как вы можете видеть json.loads значительно быстрее, чем ast.literal_eval, хотя они разобрать разные вещи, которые имеют значение только при работе с простым списков литералов.

Смежные вопросы