2016-02-02 3 views
3

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

{val1 {val2 {d1 d2 d3}}} 

Я хотел бы сделать Dict или другую подходящую структуру данных, чтобы получить доступ к структуре, как так:

data[val1][val2] 

выводит значения данных d1, d2, d3 в другую подходящую структуру данных, такую ​​как список, кортеж или набор.

Есть ли встроенная функция библиотеки, которая может это сделать или может предложить любой простой способ сделать это?

Примечание: число точек данных d1 d2 d3 не может быть постоянным, так и для другого набора значений я мог бы d1 d2 d3 d4 d5 и т.д.

Edit: Я хотел бы добавить, что я написал вывод, так что я могу изменить привязки к чему-то совершенно другому, если это необходимо.

+4

Это не обычный формат, поэтому нет, нет встроенной функции для обработки этого. Напишите код для tokenise, parse и выплюнуть словарь. –

+0

Ниже приведена краткая инструкция по использованию словаря. 'Replace ('{', ': {') [1:]' –

+0

Это не будет легко. Ваши значения заключены в '{}', но вы хотите, чтобы они были как '[]' –

ответ

4

Если все ваши данные так же просто, как, например, вы можете сделать некоторые строки манипуляции, чтобы превратить его в json.

import re, json 
data = '{val1 {val2 {d1 d2 d3}}}' 
data = re.sub(r'(\w+)', r'"\1"', data)  # {"val1" {"val2" {"d1" "d2" "d3"}}} 
data = re.sub(r'"\s*{', r'": {', data)  # {"val1": {"val2": {"d1" "d2" "d3"}}} 
data = re.sub(r'" "', r'", "', data)  # {"val1": {"val2": {"d1", "d2", "d3"}}} 
data = re.sub(r'{([^{}]*)}', r'[\1]', data) # {"val1": {"val2": ["d1", "d2", "d3"]}} 
json.loads(data) 

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

0

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

______ exampledata.txt

{a{a{hello world}}} 
{a{b{stack over flow}}} 
{b{a{example data 1}}} 
{b{b{data example 2}}} 

______converter.py

import os 

fo = open("exampledata.txt", "r") 
data = fo.read() 
fo.close() 

data = data.split("\n") 

fo = open("converteddata.txt", "w") 
for line in data: 
    line = line.split("{") 
    if len(line) < 2: 
     break 
    fo.write("data['") 
    fo.write(line[1]+"-"+line[2]+"'] = [") 
    splitData = line[3].split("}}}")[0] 
    splitData = splitData.split(" ") 
    for d in splitData: 
     fo.write("'"+d+"', ") 
    fo.seek(-2, os.SEEK_END) 
    fo.truncate() 
    fo.write("]\n") 

______ converteddata.txt (преобразователь будет производить это)

data['a-a'] = ['hello', 'world'] 
data['a-b'] = ['stack', 'over', 'flow'] 
data['b-a'] = ['example', 'data', '1'] 
data['b-b'] = ['data', 'example', '2'] 

______usage преобразованных данных

data = dict() 

data["a-a"] = ["hello", "world"] 
data["a-b"] = ["stack", "over", "flow"] 
data["b-a"] = ["example", "data", "1"] 
data["b-b"] = ["data", "example", "2"] 

val1 = raw_input("Please enter first parameter : ") 
val2 = raw_input("Please enter second parameter : ") 
index = raw_input("Please enter index : ") 

print data[val1+"-"+val2][int(index)] 

EDIT: вы не будете копировать/вставлять преобразованные данные в основной проект. Если у вас большие данные, ваш основной файл проекта кажется очень плохим. Таким образом, вы можете создать converteddata.py, который

data = dict() 

data['a-a'] = ['hello', 'world'] 
data['a-b'] = ['stack', 'over', 'flow'] 
data['b-a'] = ['example', 'data', '1'] 
data['b-b'] = ['data', 'example', '2'] 

, то вы можете импортировать его в свой основной проект, как

from converteddata import data 

print data["a-a"][0] 
Смежные вопросы