Python UnicodeDecodeError:'utf8'编解码器无法解码位置74中的字节0x80:无效的起始字节

时间:2015-10-15 20:59:08

标签: python byte hbase

我将hbase中的一些数据存储为字节和字符串,并由\ x00填充分隔。

因此我的hbase中的行如下所示: -

00:00:00:00:00:00\x00\x80\x00\x00\x00U\xEF\xA0\xB00\x002\x0040.0.2.1\x00

此行(键)对应的值为100。

行描述: -

00:00:00:00:00:00 - This is mac address and is a string 
\x80\x00\x00\x00U\xEF\xA0\xB00 - This is the time which is saved as bytes
2 - this is customer id number stored as string
40.0.2.1 - this is store ID stored as string

我使用星基模块将python连接到它的stargate服务器。

以下是我连接到starbase和hbase表的代码段,并尝试获取该行的值: -

from starbase import Connection
import starbase

C = Connection(host='10.10.5.2', port='60010')
get_table =  C.table('dummy_table')
mac_address = "00:00:00:00:00:00"
time_start = "\x80\x00\x00\x00U\xEF\xA0\xB00"
cus_id = "2"
store_id = "40.0.2.1"

create_query = "%s\x00%s\x00%s\x00%s\x00" % (mac,time_start,cus_id,store_id)

fetch_result = get_table.fetch(create_query)
print fetch_result

预期输出为: -

100

您不必担心starbase连接及其方法。如果一切都是字符串,它们工作得很好但是现在因为时间被转换成字节,它给了我错误: -

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 74: invalid start byte

以防万一我打印时需要查看create_query的输出: -

00:00:1E:00:C8:36▒U▒v▒130.0.2.6

我非常感谢一些帮助。感谢

2 个答案:

答案 0 :(得分:0)

我的猜测是你的数据库不支持在这些字段中存储字节;也许你必须存储字符串。

一种方法是在将字节存储到数据库之前将其转换为base64字符串。例如:

>>> from base64 import b64encode, b64decode
>>> b64encode("\x80\x00\x00\x00U\xEF\xA0\xB00")
'gAAAAFXvoLAw'
>>> b64decode(_)
'\x80\x00\x00\x00U\xef\xa0\xb00'

答案 1 :(得分:0)

试试这个

time_start = "\\x80\\x00\\x00\\x00U\\xEF\\xA0\\xB00"

\ x是十六进制值的转义序列,

create_query = "%s\x00%s\x00%s\x00%s\x00" % (mac,time_start,cus_id,store_id)

正在将time_start转换为字符串。由于x80无效utf-8,因此引发了错误。