2012-11-21 1 views
0

Possible Duplicate:
how to extract a text file into a dictionaryПреобразование текста в словарь с определенными ключами и значениями

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

Вы пытались что-либо сделать с текстом? Это будет содержать строки из вашего файла ... –

+0

Что подразумевается в 'text = file()'? – Vader

+0

'text' будет' None', так как ваша функция ничего не возвращает. Кроме того, посмотрите на [this] (http://stackoverflow.com/a/1710405/198633) – inspectorG4dget

ответ

3
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 

Надеется, что это помогает

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

+0

OP явно новичок, позаботьтесь, чтобы немного объяснить ваш комментарий? – jadkik94

+0

ответ = {} с открытой ('smallsolar.txt'), как INFILE: \t для линии в INFILE: \t \t линии = line.strip() \t \t, если line.startswith ('Объект'): \t \t \t OBJ = line.partition (":") [- 1] .strip() \t \t Элиф line.startswith ('орбитальный радиус'): \t \t \t радиан = INT (line.partition (":") [-1] .strip()) \t \t \t ответ [obj] = rad \t \t elif line.StartsWith ('Период'): \t \t \t в = INT (line.partition (":") [- 1] .strip()) \t \t \t ответ [OBJ] = за печать (ответ) –

+0

Я добавил период к коду, но я получаю эту ошибку –

1

Прочитайте файл в одной строке вместо 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