Python:保存的pickled计数器具有数据,但无法使用函数加载文件

Python:保存的pickled计数器具有数据,但无法使用函数加载文件,python,dictionary,pickle,Python,Dictionary,Pickle,我正在尝试建立一个外语频率词典/词汇学习者 我希望该计划: 处理一本书/文本文件,将文本分解为单独的唯一单词,并按频率排序(我使用Counter()) 将计数器()保存到pickle文件中,这样我就不必每次运行程序时都处理这本书 访问pickle文件并拉出第n个最常用的单词(使用most\u common()函数可轻松完成) 问题是,一旦我处理一本书并将其保存到pickle文件中,我就无法再次访问它。执行此操作的函数将加载一个空字典,即使在检查pickle文件时,我可以看到它确实包含数据 此外,

我正在尝试建立一个外语频率词典/词汇学习者

我希望该计划:

  • 处理一本书/文本文件,将文本分解为单独的唯一单词,并按频率排序(我使用
    Counter()
  • 计数器()
    保存到pickle文件中,这样我就不必每次运行程序时都处理这本书
  • 访问pickle文件并拉出第n个最常用的单词(使用
    most\u common()
    函数可轻松完成)
  • 问题是,一旦我处理一本书并将其保存到pickle文件中,我就无法再次访问它。执行此操作的函数将加载一个空字典,即使在检查pickle文件时,我可以看到它确实包含数据

    此外,如果我手动加载pickle文件(使用
    pickle.load()
    )并手动拉取第n个最常见的单词(使用
    most_common()
    而不是使用加载pickle并拉取第n个最常见单词的自定义函数),它将工作得很好

    我怀疑加载pickle文件的自定义函数有问题,但我不知道它是什么

    代码如下:

    import string
    import collections
    import pickle
    
    freq_dict = collections.Counter()
    dfn_dict = dict()
    
    def save_dict(name, filename):
        pickle.dump(name, open('{0}.p'.format(filename), 'wb'))
    
    #Might be a problem with this
    def load_dict(name, filename):
        name = pickle.load(open('{0}.p'.format(filename), 'rb'))
    
    def cleanedup(fh):
        for line in fh:
            word = ''
            for character in line:
                if character in string.ascii_letters:
                    word += character
                else:
                    yield word
                    word = ''
    
    #Opens a foreign language textfile and adds all unique
    #words in it, to a Counter, ordered by frequency
    def process_book(textname):
        with open (textname) as doc:
            freq_dict.update(cleanedup(doc))
        save_dict(freq_dict, 'svd_f_dict')
    
    #Shows the Nth most frequent word in the frequency dict
    def show_Nth_word(N):
        load_dict(freq_dict, 'svd_f_dict')
        return freq_dict.most_common()[N]
    
    #Shows the first N most frequent words in the freq. dictionary    
    def show_N_freq_words(N):    
        load_dict(freq_dict, 'svd_f_dict')
        return freq_dict.most_common(N)
    
    #Presents a word to the user, allows user to define it
    #adds the word and its definition to another dictionary
    #which is used to store only the word and its definition
    def define_word(word):
        load_dict(freq_dict, 'svd_f_dict')
        load_dict(dfn_dict, 'svd_d_dict')
        if word in freq_dict:
            definition = (input('Please define ' + str(word) + ':'))
            dfn_dict[word] = definition
        else:
            return print('Word not in dictionary!')
        save_dict(dfn_dict, 'svd_d_dict')
    
    这里尝试使用两种方法(手动和函数)提取n个常用词:


    谢谢你的帮助

    load\u dict函数将取消勾选的结果存储到局部变量“name”中。这不会修改作为参数传递给函数的对象

    相反,您需要从load_dict()函数返回调用pickle.load()的结果:

    from dictionary import *
    import pickle
    
    #Manual, works
    freq_dict = pickle.load(open('svd_f_dict.p', 'rb'))
    print(freq_dict.most_common()[2])
    
    #Using a function defined in the other file, doesn't work
    word = show_Nth_word(2)
    
    def load_dict(filename):
        return pickle.load(open('{0}.p'.format(filename), 'rb'))
    
    然后将其分配给变量:

    freq_dict = load_dict('svd_f_dict')
    

    load_dict函数将取消勾选的结果存储到局部变量“name”中。这不会修改作为参数传递给函数的对象

    相反,您需要从load_dict()函数返回调用pickle.load()的结果:

    from dictionary import *
    import pickle
    
    #Manual, works
    freq_dict = pickle.load(open('svd_f_dict.p', 'rb'))
    print(freq_dict.most_common()[2])
    
    #Using a function defined in the other file, doesn't work
    word = show_Nth_word(2)
    
    def load_dict(filename):
        return pickle.load(open('{0}.p'.format(filename), 'rb'))
    
    然后将其分配给变量:

    freq_dict = load_dict('svd_f_dict')
    

    load_dict函数将取消勾选的结果存储到局部变量“name”中。这不会修改作为参数传递给函数的对象

    相反,您需要从load_dict()函数返回调用pickle.load()的结果:

    from dictionary import *
    import pickle
    
    #Manual, works
    freq_dict = pickle.load(open('svd_f_dict.p', 'rb'))
    print(freq_dict.most_common()[2])
    
    #Using a function defined in the other file, doesn't work
    word = show_Nth_word(2)
    
    def load_dict(filename):
        return pickle.load(open('{0}.p'.format(filename), 'rb'))
    
    然后将其分配给变量:

    freq_dict = load_dict('svd_f_dict')
    

    load_dict函数将取消勾选的结果存储到局部变量“name”中。这不会修改作为参数传递给函数的对象

    相反,您需要从load_dict()函数返回调用pickle.load()的结果:

    from dictionary import *
    import pickle
    
    #Manual, works
    freq_dict = pickle.load(open('svd_f_dict.p', 'rb'))
    print(freq_dict.most_common()[2])
    
    #Using a function defined in the other file, doesn't work
    word = show_Nth_word(2)
    
    def load_dict(filename):
        return pickle.load(open('{0}.p'.format(filename), 'rb'))
    
    然后将其分配给变量:

    freq_dict = load_dict('svd_f_dict')
    

    事实上,我刚刚尝试了它,但它不起作用,似乎我还必须修改原始的
    load\u dict()
    函数(因为它需要两个参数)。但我想保留更改名称的功能。更改什么的名称?从中加载数据的文件的名称将是要加载的剩余参数。要更改从文件加载的数据的存储位置,请更改存储函数返回值的变量的名称。现在,我明白了,您最近的编辑清楚地说明了这一点。所以我不需要为pickle将加载到的变量指定参数,我可以直接在其他函数中这样做。现在明白了。谢谢事实上,我刚刚尝试了它,但它不起作用,似乎我还必须修改原始的
    load\u dict()
    函数(因为它需要两个参数)。但我想保留更改名称的功能。更改什么的名称?从中加载数据的文件的名称将是要加载的剩余参数。要更改从文件加载的数据的存储位置,请更改存储函数返回值的变量的名称。现在,我明白了,您最近的编辑清楚地说明了这一点。所以我不需要为pickle将加载到的变量指定参数,我可以直接在其他函数中这样做。现在明白了。谢谢事实上,我刚刚尝试了它,但它不起作用,似乎我还必须修改原始的
    load\u dict()
    函数(因为它需要两个参数)。但我想保留更改名称的功能。更改什么的名称?从中加载数据的文件的名称将是要加载的剩余参数。要更改从文件加载的数据的存储位置,请更改存储函数返回值的变量的名称。现在,我明白了,您最近的编辑清楚地说明了这一点。所以我不需要为pickle将加载到的变量指定参数,我可以直接在其他函数中这样做。现在明白了。谢谢事实上,我刚刚尝试了它,但它不起作用,似乎我还必须修改原始的
    load\u dict()
    函数(因为它需要两个参数)。但我想保留更改名称的功能。更改什么的名称?从中加载数据的文件的名称将是要加载的剩余参数。要更改从文件加载的数据的存储位置,请更改存储函数返回值的变量的名称。现在,我明白了,您最近的编辑清楚地说明了这一点。所以我不需要为pickle将加载到的变量指定参数,我可以直接在其他函数中这样做。现在明白了。谢谢