【问题标题】:How do I fix this unicode/cPickle error in Python?如何在 Python 中修复此 unicode/cPickle 错误?
【发布时间】:2010-05-31 21:36:53
【问题描述】:
ids = cPickle.loads(gem.value)

loads() argument 1 must be string, not unicode

【问题讨论】:

  • 为什么gem.value是unicode而不是字符串?

标签: python unicode pickle


【解决方案1】:

cPickle.loads 想要一个字节字符串(这正是cPickle.dumps 输出的内容),而您却给它提供了一个 unicode 字符串。您需要“编码”该 Unicode 字符串以取回 dumps 最初给您的字节字符串,但很难猜出您不小心强加于它的编码 - 可能是 latin-1utf-8(如果ascii 别担心,这两个中的任何一个都会很好地解码它),也许utf-16...?如果不知道gem 是什么以及您最初是如何从cPickle.dumps 的输出中设置它的value...!

【讨论】:

    【解决方案2】:

    cPickle.dumps() 的结果是 str 对象,而不是 unicode 对象。您需要在代码中找到解码腌制的str 对象的步骤,然后省略该步骤。

    不要尝试将您的 unicode 对象转换为 str 对象。两个错误不等于一个正确。示例(Python 2.6):

    >>> import cPickle
    >>> ps = cPickle.dumps([1,2,3], -1)
    >>> ps
    '\x80\x02]q\x01(K\x01K\x02K\x03e.'
    >>> ups = ps.decode('latin1')
    >>> str(ups)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
    >>>
    

    您很可能正在使用默认(且效率低下)协议 0,它会产生“人类可读”的输出:

    >>> ps = cPickle.dumps([1,2,3])
    >>> ps
    '(lp1\nI1\naI2\naI3\na.'
    >>>
    

    这大概是 ASCII(但没有记录是这样)所以str(gem.value) kludge 很可能“”“工作”“”:

    >>> ps == str(unicode(ps))
    True
    >>>
    

    【讨论】:

      【解决方案3】:

      您可以通过将gem.value 设为字符串而不是 unicode 来修复它。

      使用str(gem.value)

      【讨论】:

      • -1 那是杂牌,不是解决办法。 str() 使用默认编码。您首先需要知道它是如何解码的。
      猜你喜欢
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2022-06-28
      • 2011-02-20
      • 2021-01-13
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多