Как извлечь текстовый файл в словарь

Мне интересно, как вы могли бы извлечь текст в словарь в Python. текстовый файл отформатирован как таковой (см. ниже) и извлечен таким образом, что, например, земля объекта является ключом, а его радиус, период и все находятся в пределах его ключа.

RootObject: Sun

Object: Sun

Satellites: Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris

Radius: 20890260

Orbital Radius: 0

Object: Earth

Orbital Radius: 77098290

Period: 365.256363004

Radius: 6371000.0

Satellites: Moon

Object: Moon

Orbital Radius: 18128500

Radius: 1737000.10

Period: 27.321582

3 ответа

nk="""
RootObject: Sun

Object: Sun
Satellites: Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris
Radius: 20890260
Orbital Radius: 0

Object: Earth
Orbital Radius: 77098290
Period: 365.256363004
Radius: 6371000.0
Satellites: Moon

Object: Moon
Orbital Radius: 18128500
Radius: 1737000.10
Period: 27.321582

"""

my_test_dict={}
for x in nk.splitlines():
    if ':' in x:
        if x.split(':')[0].strip()=='RootObject':
            root_obj=x.split(':')[1].strip()
        elif x.split(':')[0].strip()=='Object':
            my_test_dict[x.split(':')[1].strip()]={}
            current_dict=x.split(':')[1].strip()
            if x.split(':')[1].strip()!=root_obj:
                for x1 in my_test_dict:
                    if 'Satellites' in my_test_dict[x1]:
                        if x.split(':')[1].strip() in my_test_dict[x1]['Satellites'].split(','):
                            my_test_dict[x.split(':')[1].strip()]['RootObject']=x1
        else:
            my_test_dict[current_dict][x.split(':')[0].strip()]=x.split(':')[1].strip()

print my_test_dict

выход:

{
    'Sun':
        {
        'Satellites': 'Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris',
        'Orbital Radius': '0',
        'Radius': '20890260'
        },

    'Moon':
        {
        'Orbital Radius': '18128500',
        'Radius': '1737000.10',
        'Period': '27.321582',
        'RootObject': 'Earth'
         },

    'Earth':
        {
        'Satellites': 'Moon',
        'Orbital Radius': '77098290',
        'Radius': '6371000.0',
        'Period': '365.256363004',
        'RootObject': 'Sun'
        }
    }

Используя модификацию одного из вышеперечисленных, вы получите что-то вроде следующего:

def read_next_object(file):    
        obj = {}               
        for line in file:      
                if not line.strip(): continue
                line = line.strip()                        
                key, val = line.split(": ")                
                if key in obj and key == "Object": 
                        yield obj                       
                        obj = {}                              
                obj[key] = val

        yield obj              
planets = {}                   
with open( "test.txt", 'r') as f:
        for obj in read_next_object(f): 
                planets[obj["Object"]] = obj    

print planets                  

Исправить случай для RootObject и я считаю, что это последний словарь, который вы ищете из приведенных вами примеров данных. Это словарь планет, где каждая планета является словарем своей информации.

print planets["Sun"]["Radius"]

Следует напечатать значение 20890260

Вывод из вышесказанного выглядит следующим образом:

{   'Earth': {   'Object': 'Earth',
             'Orbital Radius': '77098290',
             'Period': '365.256363004',
             'Radius': '6371000.0',
             'Satellites': 'Moon'},
     'Moon': {   'Object': 'Moon',
            'Orbital Radius': '18128500',
            'Period': '27.321582',
            'Radius': '1737000.10'},
     'Sun': {   'Object': 'Sun',
           'Orbital Radius': '0',
           'Radius': '20890260',
           'RootObject': 'Sun',
           'Satellites': 'Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris'}}

Предполагая, что вы хотите элементы с разделенными запятыми значениями в виде списков, попробуйте:

mydict={}
with open(my_file,'r') as the_file:
    for line in the_file:
        if not line.strip(): continue # skip blank lines
        key,val=line.split(": ")
        val = val.split(",")
        mydict[key] = val if len(val) > 1 else val[0]
Другие вопросы по тегам