Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建一个打开文件并创建字典的函数_Python_Function_Dictionary - Fatal编程技术网

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

Python 创建一个打开文件并创建字典的函数,python,function,dictionary,Python,Function,Dictionary,我有一个正在处理的文件。我想创建一个函数来读取文件并将内容放入字典中。然后需要通过主函数传递该字典。这是主要节目。这是无法改变的。我所做的一切都必须与主程序配合 def main(): sunspot_dict = {} file_str = raw_input("Open what data file: ") keep_going = True while keep_going: try: init_dictionary(

我有一个正在处理的文件。我想创建一个函数来读取文件并将内容放入字典中。然后需要通过主函数传递该字典。这是主要节目。这是无法改变的。我所做的一切都必须与主程序配合

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

考虑到您在回复Raymond时给出的限制,即您不能修改
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\u dict=MySunspotDict(file\u str)
行位于您当前拥有的
init\u字典(file\u str,sunspot\u dict)
,因此您现有的
file\u str
将被传递给
MySunspotDict
构造函数(
\uu init\uuu()
方法),然后将其传递给
init\u字典()

init\u dictionary()
调用的工作原理与您已有的调用相同,只是它将新对象而不是空的
dict
传递给填充字典的函数。由于您的新类是从
dict
派生的,也就是说,它是一个子类,因此它的工作原理与常规词典类似。因此,您所拥有的基本上是一个
dict
,您可以将自己的方法附加到它。(您还可以通过定义具有特殊名称的方法来覆盖某些标准字典行为,但在本例中不需要这样做。)


注意,在您的方法中,
self
将是字典——您不需要在
\uuuu init\uuuu()
中创建字典并将其存储为类的属性(您将在许多Python代码中看到此模式)。当
\uuuu init\uuuu()
运行时,词典已经存在。

根据您的第二条注释和预览代码,您的操作是正确的。Python中的字典是通过引用传递的,因此您应该能够填充提供给
init\u dictionary
的字典,并且可以在
main()
中访问这些值。在您的例子中,您正在
init\u dictionary
中创建一个新的字典,其行为
sunspot\u dict={}
。您不想这样做,因为您要使用的词典已在
main()
中创建


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

@KarlKnechtel时逐行读取它。我不确定如何继续。也许我对这个问题的理解是错误的。下面是作业所说的:初始化字典(文件字符串,太阳黑子字典)。此函数将要打开的文件名和空字典作为参数。它没有返回值,但用值填充字典。关键应该是今年,;数据应该是当年几个月的太阳黑子数据列表。这是说在类下使用init函数来实现这一点吗?或者我应该创建一个名为init_dictionary(file_string,sunspot_dict)的普通函数吗?因为主函数要求用户输入文件名,我如何将其与我创建的类连接?从您的示例来看,主函数将超出myUnspotDict类的范围,对吗?你能给我解释一下下面的代码吗?init_dictionary(file_str,self)添加了一些额外的澄清。“sunspot_dict=mysunsupotdict(file_str)行位于当前init_dictionary(file_str,sunspot_dict)所在的位置”您是否试图从while循环下的主函数更改它?继续:尝试:init_dictionary(file_str,sunspot_dict),除了IOError:我不能更改主函数中的任何内容。我编写的代码必须与main函数配合使用。我需要读取用户从主函数输入的文件,并将数据放入字典。如果我不理解您的解释,我很抱歉。我只是在理解课堂上遇到了很多麻烦。哎呀,这是我的错误。我以为您无法修改
init\u dicitonary()
函数。如果您不能修改
main()
函数,我就找不到一种合理的方法来实现您的要求。将您的程序更改为面向对象通常需要您能够更改您的程序,通常是相当大的更改。它只是一个文本文件。月平均太阳黑子数=============================================================================================================年1月2月3日4月5月6月7月8月9日11月12日--------------------------------------------------------------------------1749 58.0 62.6 70.0 55.7 85.0 83.5 94.8 66.3 75.9 75.5 158.685.2我已将年份转换为键,并将后面的数字转换为值。现在我需要去掉所有的东西,除了数字。有什么好办法吗?从那里我需要创建元组。一年一个月。这是为了让用户输入时间量并获得平均值。您是否编写了
avg_sunspot
函数?看起来需要你的字典,然后是两个元组:一个表示年到平均值的范围,另一个表示月的范围。如果你在写这个函数时遇到困难,你应该提出一个新问题。不过,对于你的字典,我认为你很接近了。它应该使用年份作为键,然后有一个数字列表(其中12个)作为值。我不知道你所说的“除去数字以外的所有内容”是什么意思,但你可能想使用和
float(str)
。我能够通过使用.isdigit()并将这些值仅放入字典中来找出如何仅获取数字。至于这个函数:avg_太阳黑子(
class MySunspotDict(dict):
    def __init__(self, file_str):
        init_dictionary(file_str, self)

    # ... define your other methods here

sunspot_dict = MySunspotDict(file_str)