一行包含十六进制的字节:如何转换为字符串

时间:2019-06-12 01:53:20

标签: python python-3.x string hex byte

我正在Centos RHEL Fedora上使用Python 3.7.3。

获取一个包含字节数据行的CSV文件。我可以毫无问题地解码这些字符串,除非该行具有“十六进制”字符。

文件中的示例字符串:

b'12010000,NY0400001111121242221121,1,001,Get Apple \x42 Device Soon,2011-04-10 00:01:21\r\n'

我希望将\ x42数据转换为其ascii值,或者将其完全删除。

我尝试使用s.decode()对其进行解码。但这会产生错误“ UnicodeDecodeError:'utf-8'编解码器无法解码位置48的字节0x96:无效的起始字节”

我试图一次读取一个字符中的字符串,但是由于它仍然是字节,所以我没有得到有意义的数据点。

可能缺少一些基本知识,但是我无法弄清楚。 有什么想法吗?

所需的输出:

b'12010000,NY0400001111121242221121,1,001,Get Apple B Device Soon,2011-04-10 00:01:21\r\n'
or
b'12010000,NY0400001111121242221121,1,001,Get Apple  Device Soon,2011-04-10 00:01:21\r\n'

编辑: 其他编码人员表示他们能够阅读此行。所以我想我会尝试另一行,并逐步显示路径:

>>> read_file=open(old_NME, 'rb')
>>> lines=read_file.readlines()
>>> lines[10]
b'2806817,DE39649173950492739481,9,999,Get Data \x96 Input accepted,2011-09-10 07:37:11\r\n'
>>> s = b'2806817,DE39649173950492739481,9,999,Get Data \x96 Input accepted,2011-09-10 07:37:11\r\n'
>>> s == lines[10]
True
>>> s.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 48: invalid start byte
>>>

2 个答案:

答案 0 :(得分:0)

要转换有问题的字符或将其完全删除,请将errors='ignore'作为关键字参数传递给decode()

>>> b'Get Apple \x42 Device Soon'.decode(errors='ignore')
'Get Apple B Device Soon'
>>> b'Get Data \x96 Input accepted'.decode(errors='ignore')
'Get Data  Input accepted'

答案 1 :(得分:0)

在不知道应该期待什么的情况下,很难猜测可能是什么编码。 b'\x96'在Windows cp1252中解码为'–'(EN DASH U + 2013),或者在cp850中解码为'û'(带有小写字母U + 00FD的拉丁文小写字母U)。唯一可以肯定的是它不能是UTF-8。

所以我的建议是将文件作为文本打开以除去这些字节,并声明带有错误参数而不是raise的可能编码:

>>> read_file=open(old_NME, encoding='cp1252', errors='ignore')
>>> lines=read_file.readlines()
>>> lines[10]

它应该给出:

'2806817,DE39649173950492739481,9,999,Get Data – Input accepted,2011-09-10 07:37:11\r\n'