【问题标题】:How to load a pickle file containing a dictionary with unicode characters?如何加载包含带有 unicode 字符的字典的 pickle 文件?
【发布时间】:2012-04-04 03:41:15
【问题描述】:

我有一本字典:

mydict={'öö':1,'ää':2}

我已将其写入泡菜文件:

a=codecs.open(r'mydict.pkl', 'wb', 'utf-8')
pickle.dump(mydict, a)

如果我尝试加载它:

m=codecs.open(r'mydict.pkl', 'rb', 'utf-8')
mydict = pickle.load(m)

我收到一个错误:

KeyError: u"S'\\xe4\\xe4'\np1\nI2\nsS'\\xf6\\xf6'\np2\nI1\ns."

任何想法如何解决这个问题?非常感谢您的帮助。

【问题讨论】:

    标签: python unicode dictionary pickle


    【解决方案1】:

    老问题,但是...我也遇到过同样的问题,我认为额外的磁盘 IO 不是一个好的解决方案。我建议你使用 base64 编码/解码。

    import base64
    
    serialized_str = base64.b64encode(pickle.dumps(mydict))
    my_obj_back = pickle.loads(base64.b64decode(serialized_str))
    

    即使是 cPickle 也可以以相同的方式使用,以获得更快的批量结果。

    【讨论】:

      【解决方案2】:

      pickle 是一种二进制格式,在编写之前使用编解码器翻译会破坏它。尝试只写入文件并将其加载回来:

      >>> mydict={'öö':1,'ää':2}
      >>> mydict
      {'\xc3\xb6\xc3\xb6': 1, '\xc3\xa4\xc3\xa4': 2}
      >>> pickle.dump(mydict, open('/tmp/test.pkl', 'wb'))
      >>> pickle.load(open('/tmp/test.pkl', 'rb'))
      {'\xc3\xb6\xc3\xb6': 1, '\xc3\xa4\xc3\xa4': 2}
      

      但很可能您首先想使用 Unicode:

      >>> mydict={u'öö':1,u'ää':2}
      

      【讨论】:

        【解决方案3】:

        我认为问题在于codecs.open 的使用。 Pickles 是二进制而不是文本,codec 用于从某些文本编码到 unicode 的透明转换。你应该改用open

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-09
          • 2012-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-19
          相关资源
          最近更新 更多