2012-05-15 4 views
0

Я пытаюсь написать функцию, которая превратит мой текстовый файл в словарь с подмножествами. Текст документа, который я загружен до сих пор отображается как показал:Python - loading file - dictionary

101 
102 
103 
201, John Cleese, 5/5/12, 5/7/12 
202 
203, Eric Idle, 7/5/12, 8/7/12 
301 
302 
303 

результат функции должен получить информацию загружен и вернуть его как:

[('101', None), ('102', None), ('103', None), 
('201', Guest(John Cleese, 05/05/12, 05/07/12)), ('202', None), 
('203', Guest(Eric Idle, 07/05/12, 08/07/12)), ('301', None), 
('302', None), ('303', None)] 

я пытался isdigit, но но безрезультатно. Мне удалось получить последнюю комнату (303), чтобы почти функционировать.

def load_rooms(self, filename): 
    fd = open(filename, 'rU') 
    self._rooms = {} 
    for i in fd: 
     i = i.rstrip() 
     print i 

    if i.isdigit(): 
     self._rooms[i] = None 
     print self._rooms 
    else: 
     print i 

отображает

101 
102 
103 
201, John Cleese, 5/5/12, 5/7/12 
202 
203, Eric Idle, 7/5/12, 8/7/12 
301 
302 
303 
{'303': None} 

Ого, я только заметил, что номер 303 показан дважды ... Ну мой вопрос, как бы я подхожу загрузку текстового файла? Должен ли я удостовериться, что весь код находится в формате, или я могу просто написать функцию, которая превратит ее в словарь с подмножествами? Я совершенно новый со словарями, поэтому небольшая помощь будет отличной. благодаря

+2

Вы знаете о модуле 'csv'? –

+0

Почему ts tagged с tkinter? Я не вижу ничего связанного с Ткинтером в вопросе. –

+0

@ Bryan Oakley извините, ваше право. я попытаюсь удалить его. –

ответ

1
import re 

class Guest(object): 
    ... 

data = [] 
with open('data.txt') as f: 
    for line in f: 
    tok = re.split(r'\s*,\s*', line.strip()) 
    if len(tok) > 1: 
     guest = Guest(tok[1], tok[2], tok[3]) 
    else: 
     guest = None 
    data.append((tok[0], guest)) 

print(data) 

Реализация Guest класса остается в качестве упражнения для читателя.

+0

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

+0

Вы можете поместить этот код (минус декларация и реализация класса 'Guest') в функции, где вам это нужно. Просто убедитесь, что вы импортируете класс 'Guest', если он находится в другом модуле. – dj18

0

Я не уверен, что если вам нужен модуль re

попробовать это

def load_file(filename): 
    text = open("data.txt").readlines() 
    rooms = {} 
    for line in text: 
     room_data = line.strip('\n').split(',') 
     if len(room_data) > 1: 
      #rooms[room_data[0]] = room_data[1:] 
      rooms[room_data[0]] = tuple(room_data[1:]) 
     else: 
      rooms[room_data[0]] = None 

    return rooms 

вы упоминаете словарь в заголовке, но ваш ожидаемый результат вложенных списков.

Редактировать

Ответил?

+0

Отображается: {'201': ['John Cleese', '5/5/12', '5/7/12'], '203': ['Eric Idle', '7/5/12' , '8/7/12'], '202': None, '301': None, '302': None, '303': None, '102': None, '103': None, '101': None, '101': None, '. None} –

+0

yes {'KEY': Value, ...} - словарь [(ключ, значение), (ключ, значение)) - это вложенные списки, используемые как словарь. – corn3lius

+0

Есть ли способ сделать отображаемым: {'key': (value)} вместо {'key': [value]}? –