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


0

我在hbase中存储了一些数据,这些数据以字节和字符串的形式组合起来,由x00填充分隔。

所以hbase中的行看起来比如:-

00:00:00:00:00:00x00x80x00x00x00UxEFxA0xB00x002x0040.0.2.1x00

该行( key)对应的值为100。

de行描述:-

00:00:00:00:00:00 - This is mac address and is a string 
x80x00x00x00UxEFxA0xB00 - 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

我使用了starbase模块将python join到它的stargate服务器。

下面是我的代码片段,用于 join到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 = "x80x00x00x00UxEFxA0xB00"
cus_id = "2"
store_id = "40.0.2.1"

create_query = "%sx00%sx00%sx00%sx00" % (mac,time_start,cus_id,store_id)

fetch_result = get_table.fetch(create_query)
print fetch_result

预期输出为:-

100

你不必担心星基 join和它的方法。如果一切都是一个字符串,它们就可以正常 job ,但是现在由于时间被 transformation成字节,它给了我错误:-

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

以防您在打印时需要查看createu query的输出:-

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

我非常感谢你的帮助。谢谢

2 答案


0

试试这个

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

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

create_query = "%sx00%sx00%sx00%sx00" % (mac,time_start,cus_id,store_id)

正在将时间 transformation为字符串。因为x80不是有效的utf-8,所以它抛出了一个错误。


0

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

一种方法是将字节 transformation为base64字符串,然后再将它们存储在数据库中。例如:

>>> from base64 import b64encode, b64decode
>>> b64encode("x80x00x00x00UxEFxA0xB00")
'gAAAAFXvoLAw'
>>> b64decode(_)
'x80x00x00x00Uxefxa0xb00'

我来回答

写文章

提问题

面试题