Как извлечь текстовый файл в словарь
Мне интересно, как вы могли бы извлечь текст в словарь в 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]