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