如何使用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的

  • Pickle是一种二进制格式,因此不应使用任何编解码器打开该文件,只要:

    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'))