Преобразование текста в словарь с определенными ключами и значениями
Возможный дубликат:
как извлечь текстовый файл в словарь
У меня есть текстовый файл, где я хотел бы изменить его в словарь в 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