Преобразование текста в словарь с определенными ключами и значениями

Возможный дубликат:
как извлечь текстовый файл в словарь

У меня есть текстовый файл, где я хотел бы изменить его в словарь в Python. Текстовый файл выглядит следующим образом. Где я хотел бы иметь ключи как "солнце" и "земля" и "луна", а затем для значений орбитальный радиус, период и так далее, чтобы я мог реализовать анимацию солнечной системы в quickdraw.

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

Мой код до сих пор

def file():
    file = open('smallsolar.txt', 'r')
    answer = {}
    text = file.readlines() 
    print(text)



text = file() 
print (text)

Я не уверен, что делать сейчас. Есть идеи?

2 ответа

answer = {} # initialize an empty dict
with open('path/to/file') as infile: # open the file for reading. Opening returns a "file" object, which we will call "infile"

    # iterate over the lines of the file ("for each line in the file")
    for line in infile:

        # "line" is a python string. Look up the documentation for str.strip(). 
        # It trims away the leading and trailing whitespaces
        line = line.strip()

        # if the line starts with "Object"
        if line.startswith('Object'):

            # we want the thing after the ":" 
            # so that we can use it as a key in "answer" later on
            obj = line.partition(":")[-1].strip()

        # if the line does not start with "Object" 
        # but the line starts with "Orbital Radius"
        elif line.startswith('Orbital Radius'):

            # get the thing after the ":". 
            # This is the orbital radius of the planetary body. 
            # We want to store that as an integer. So let's call int() on it
            rad = int(line.partition(":")[-1].strip())

            # now, add the orbital radius as the value of the planetary body in "answer"
            answer[obj] = rad

Надеюсь это поможет

Иногда, если в вашем файле есть число в десятичной записи ("числа с плавающей запятой" на языке Python)3.14и т. д.), вызов int на этом не получится. В этом случае используйте float() вместо int()

Прочитайте файл в одну строку вместо readlines() и затем разбейте на "\n\n", таким образом у вас будет список элементов, каждый из которых описывает ваш объект.

Тогда вы можете захотеть создать класс, который делает что-то вроде этого:

class SpaceObject:
  def __init__(self,string):
    #code here to parse the string

    self.name = name
    self.radius = radius
    #and so on...

затем вы можете создать список таких объектов с

#items is the list containing the list of strings describing the various items
l = map(lambda x: SpaceObject(x),items).

А затем просто сделайте следующее

d= {}
for i in l:
  d[i.name] = i
Другие вопросы по тегам