Создать функцию, которая открывает файл и создает словарь - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть файл, с которым я работаю. Я хочу создать функцию, которая читает файлы и помещает содержимое в словарь. Затем этот словарь необходимо передать через основную функцию. Вот основная программа. Это не может быть изменено. Все, что я делаю, должно работать с основной программой.

def main():
    sunspot_dict = {}
    file_str = raw_input("Open what data file: ")
    keep_going = True
    while keep_going:
        try:
            init_dictionary(file_str, sunspot_dict)
        except IOError:
            print "Data file error, try again"
            file_str = raw_input("Open what data file: ")    
            continue
        print "Jan, 1900-1905:", avg_sunspot(sunspot_dict, (1900,1905),(1,1))
        print "Jan-June, 2000-2011:", avg_sunspot(sunspot_dict, (2000,2011), (1,6))
        print "All years, Jan:", avg_sunspot(sunspot_dict, month_tuple=(1,1))
        print "All months, 1900-1905:", avg_sunspot(sunspot_dict, year_tuple=(1900,1905))
        try:
            print "Bad Year Key example:", avg_sunspot(sunspot_dict, (100,1000), (1,1))
        except KeyError:
            print "Bad Key raised"
        try:
            print "Bad Month Index example:", avg_sunspot(sunspot_dict, (2000,2011), (1,100))
        except IndexError:
            print "Bad Range raised"
        keep_going = False
    print "Main function finished normally."

    print sunspot_dict

Вот что у меня есть:

def init_dictionary(file_str, sunspot_dict):
    line = open(file_str, "rU")
    sunspot_dict = {}
    for i in line:
        sunspot_dict[i]
print sunspot_dict

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

Исходя из вашего второго комментария и кода предварительного просмотра, вы на правильном пути. Словари в Python передаются по ссылке, поэтому вы должны просто заполнить словарь, указанный в init_dictionary, а значения будут доступны в main(). В вашем случае вы создаете новый словарь в init_dictionary со строкой sunspot_dict = {}. Вы не хотите этого делать, потому что словарь, который вы хотите использовать, уже создан в main().

На данный момент нам нужно знать формат файла, который вы читаете. По сути, вам нужно открыть файл, а затем, вероятно, читать его построчно, разбирая строки в пары ключ / значение и заполняя sunspot_dict.

1 голос
/ 14 ноября 2011

Учитывая ограничение, которое вы даете в своем ответе Рэймонду, что вы не можете изменить метод init_dictionary() и что для него требуется передать ему словарь, который он затем заполнит, я рекомендую вам сделать свой собственный класс подкласс dict.

class MySunspotDict(dict):
    def __init__(self, file_str):
        init_dictionary(file_str, self)

    # ... define your other methods here

sunspot_dict = MySunspotDict(file_str)

Строка sunspot_dict = MySunspotDict(file_str) идет туда, где у вас есть init_dictionary(file_str, sunspot_dict), поэтому ваш существующий file_str передается в конструктор MySunspotDict (метод __init__()), который затем передает его в init_dictionary().

Вызов init_dictionary() работает так же, как тот, который у вас уже есть, за исключением того, что он передает новый объект, а не пустой dict, в функцию, которая заполняет словарь. Так как ваш новый класс является производным от dict, то есть это подкласс, он работает как обычный словарь для этой цели. Так что у вас есть в основном dict, к которому вы можете прикрепить свои собственные методы. (Вы также можете переопределить некоторые из стандартных свойств словаря, определяя методы со специальными именами, но вам не нужно делать это в этом случае.)

Обратите внимание, что в ваших методах self будет словарем - вам не нужно создавать словарь в вашем __init__() и сохранять его как атрибут вашего класса (вы увидите этот шаблон во многих кода Python). К моменту запуска __init__() словарь уже существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...