PYTHON3(而不是PYTHON2)TypeError:不会将Unicode隐式转换为字节;使用.encode()

时间:2017-05-05 13:17:18

标签: unicode transactions byte python-3.5 encode

我的这个功能与python2

完美配合
 def writeCache(env, cache):
        with env.begin(write=True) as txn:
            for k, v in cache.items():
                txn.put(k, v)

但是当我用python3.5.2执行它时,它会返回以下错误:

txn.put(k, v)
TypeError: Won't implicitly convert Unicode to bytes; use .encode()

首先尝试解决这个问题:

def writeCache(env, cache):
            with env.begin(write=True) as txn:
                for k, v in cache.items():
                    k.encode()

有效,但不包括变量v。

def writeCache(env, cache):
                with env.begin(write=True) as txn:
                    for k, v in cache.items():
                        k.encode()
                        v.encode()

我得到以下内容:

AttributeError: 'bytes' object has no attribute 'encode'

v.encode()

相关

2 个答案:

答案 0 :(得分:3)

txn.put(str(k).encode(), str(v).encode())

对我有用的

答案 1 :(得分:0)

你并没有真正提供大量信息,但这是我最好的猜测:

        for k, v in cache.items():
            txn.put(k.encode(), v)

从标题中的TypeError判断,txn.put()方法希望有字节,但至少有一个参数是(unicode)字符串。

v显然已经是一个字节对象(因此是AttributeError),因此不再需要对其进行编码。 但是如果k.encode()有效,则很可能是违规(unicode)字符串,编码它应该可以解决问题。

请注意,str.encode()默认使用'utf-8'。 目前尚不清楚Python 2中是否使用相同的默认值,其中转换是隐式完成的。 我想这取决于您使用的库(txn.put()来自的库)。