2016-04-22 4 views
0

В принципе, я хочу прочитать строку из текстового файла и сохранить его как orderedDict. В моем файле находится следующее содержание.Python как читать orderedDict из txt-файла

content.txt:

variable_one=OrderedDict([('xxx', [['xxx_a', 'xxx_b'],['xx_c', 'xx_d']]),('yyy', [['yyy_a', 'yyy_b'],['yy_c', 'yy_d']]))]) 

variable_two=OrderedDict([('xxx', [['xxx_a', 'xxx_b'],['xx_c', 'xx_d']]),('yyy', [['yyy_a', 'yyy_b'],['yy_c', 'yy_d']]))]) 

как я буду получать значения в Python, как:

xxx 

    xxx_a -> xxx_b 

    xxx_c -> xxx_d 
+2

Откуда взялся этот файл? Не могли бы вы использовать лучший формат? – jonrsharpe

+0

Это дает мне синтаксические ошибки, когда я пытаюсь запустить обычный код – Greg

+2

Непонятно, что именно вы хотите вывести 'xxx_c -> xxx_d' не встречается в исходной строке, а' yyy' не встречается на выходе, у вас есть скобка несоответствие. Но если бы я был вами, я бы посмотрел на [execfile] (https://docs.python.org/2/library/functions.html#execfile) и попробовал такую ​​часть кода 'из коллекции import OrderedDict; v = {'OrderedDict': OrderedDict}; execfile ('1.txt', {}, v); print v' (я предполагаю, что вы файл с именем '1.txt') ** Примечание ** вызов execfile опасен, если вы не доверяете источнику этого файла, поскольку он может, например, удалить все файлы на вашем компьютере. –

ответ

0
import re 
from ast import literal_eval 
from collections import OrderedDict 

# This string is slightly different from your sample which had an extra bracket 
line = "variable_one=OrderedDict([('xxx', [['xxx_a', 'xxx_b'],['xx_c', 'xx_d']]),('yyy', [['yyy_a', 'yyy_b'],['yy_c', 'yy_d']])])" 
match = re.match(r'(\w+)\s*=\s*OrderedDict\((.+)\)\s*$', line) 
variable, data = match.groups() 

# This allows safe evaluation: data can only be a basic data structure 
data = literal_eval(data) 

data = [(key, OrderedDict(val)) for key, val in data] 
data = OrderedDict(data) 

Проверка, что она работает:

print variable 
import json 
print json.dumps(data, indent=4) 

Выход:

variable_one 
{ 
    "xxx": { 
     "xxx_a": "xxx_b", 
     "xx_c": "xx_d" 
    }, 
    "yyy": { 
     "yyy_a": "yyy_b", 
     "yy_c": "yy_d" 
    } 
} 

Сказав это, ваш запрос очень странный. Если вы можете управлять источником данных, используйте реальный формат сериализации, который поддерживает порядок (а не JSON). Не выводить код Python.