创建一个打开文件并创建字典的函数

时间:2011-11-14 04:46:19

标签: python function dictionary

我有一个我正在使用的文件。我想创建一个读取文件并将内容放入字典的函数。然后该字典需要通过main函数传递。这是主程序。它无法改变。我所做的一切都必须与主程序一起使用。

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 个答案:

答案 0 :(得分:1)

鉴于您在回复Raymond时给出的限制,您无法修改init_dictionary()方法,并且要求您传递一个字典然后填充它,我建议您自己创建class 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__()运行时已经存在。

答案 1 :(得分:1)

根据您的第二条评论和预览代码,您走在正确的轨道上。 Python中的字典通过引用传递,因此您应该只能填充提供给init_dictionary的字典,并且可以在main()中访问这些值。在您的情况下,您将使用行init_dictionarysunspot_dict = {}中创建新词典。您不希望这样做,因为您要使用的词典已在main()

中创建

此时我们需要知道您正在阅读的文件的格式。基本上你需要打开文件,然后可能在将行分解为键/值对并填充sunspot_dict时逐行读取。