如何使用cpicklepython将包含utf-8字符的字典保存为文件的键?
我想知道如何使用如何使用cpicklepython将包含utf-8字符的字典保存为文件的键?,python,dictionary,pickle,Python,Dictionary,Pickle,我想知道如何使用cPickle将包含utf-8字符的字典保存为Python文件的键?这本词典非常大,我听说cPickle比pickle快得多。另外,我认为使用utf-8编码密钥也有问题。 我们也欢迎任何其他快速解决方案。 以下是我所做的,下面是错误消息: unique_ngrams_dict = defaultdict(lambda: 0)# just to show how I defined my dict dict_file = codecs.open('ngram_dict', 'w
cPickle
将包含utf-8字符的字典保存为Python文件的键?这本词典非常大,我听说cPickle
比pickle
快得多。另外,我认为使用utf-8编码密钥也有问题。
我们也欢迎任何其他快速解决方案。
以下是我所做的,下面是错误消息:
unique_ngrams_dict = defaultdict(lambda: 0)# just to show how I defined my dict
dict_file = codecs.open('ngram_dict', 'w', 'utf-8')
cPickle.dump(unique_ngrams_dict,dict_file)
dict_file.close()
Traceback (most recent call last):
File "Generate_NGram.py", line 81, in <module>
save_ngram_dict(unique_ngrams_dict)
File "Generate_NGram.py", line 70, in save_ngram_dict
cPickle.dump(unique_ngrams_dict,dict_file)
File "/usr/lib/python2.6/copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle function objects
错误消息:
unique_ngrams_dict = defaultdict(lambda: 0)# just to show how I defined my dict
dict_file = codecs.open('ngram_dict', 'w', 'utf-8')
cPickle.dump(unique_ngrams_dict,dict_file)
dict_file.close()
Traceback (most recent call last):
File "Generate_NGram.py", line 81, in <module>
save_ngram_dict(unique_ngrams_dict)
File "Generate_NGram.py", line 70, in save_ngram_dict
cPickle.dump(unique_ngrams_dict,dict_file)
File "/usr/lib/python2.6/copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle function objects
回溯(最近一次呼叫最后一次):
文件“Generate_NGram.py”,第81行,在
保存日志(唯一日志)
文件“Generate\NGram.py”,第70行,在save\NGram\u dict中
cPickle.dump(唯一的dict、dict文件)
文件“/usr/lib/python2.6/copy_reg.py”,第70行,在
raise TypeError,“无法pickle%s对象”%base.\u\n__
TypeError:无法pickle函数对象
谢谢您应该这样做,相信pickle模块会做正确的事情。处理pickle最好的方法是将其视为一团不透明的东西,当您解开pickle时,它会神奇地重新创建您开始使用的确切数据结构 不要试图对pickle的输出应用任何类型的编码,它应该被视为二进制blob。如果在pickle时有unicode元素,那么一旦取消pickle,它们将是unicode的
file('ngram_dict', 'w')
这不是它失败的原因,只是效率很低lambda:0
)和pickle格式不支持序列化函数
您将有三个选项:
dict
并使用它的。使用默认参数获取方法
unique_ngrams_dict.default_factory = None
在酸洗之前,将其放回
unique_ngrams_dict.default_factory = lambda: 0
解钩后class NgramDefault:
def __call__():
return 0
并使用NgramDefault()
作为默认工厂,而不是lambda:0
为什么你认为utf8键有问题?你试过酸洗吗?没有,但是当我想将它们写入文件时,我应该对它们进行编码吗?你得到的类型错误似乎表明
uniq\u ngrams\u dict
是一个函数,而不是字典。我仔细检查了它,它确实是一个defaultdict类型。那么,字典中的某些元素就是一个函数。有更快的选项吗?我是说在文件的写入/加载方面?@Hossein-这与你问的问题完全不同。如果您想给出一个数据结构的示例,并问“将此数据结构放入文件并重新取出的最快方法是什么?”这个问题,我相信您会得到一些很好的答案。显然,唯一的\u ngrams\u dict=defaultdict(int)应该这样做。我认为该文件应该像该文件一样打开('ngram\u dict','wb'))