我正在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
>>>
答案 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'