Вопрос:

Одна строка байта, содержащая Hex: как преобразовать в строку

python python-3.x string hex byte

21 просмотра

2 ответа

800 Репутация автора

Я использую Python 3.7.3 на Centos RHEL Fedora.

Взятие файла 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 »не может декодировать байт 0x96 в позиции 48: недопустимый начальный байт»

Я пытался прочитать строку по одному символу за раз, но, поскольку она все еще является байтом, я не получаю значимой точки данных.

Возможно, упустил что-то простое, но я не смог понять это. Есть идеи?

Желаемый результат:

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
>>>
Автор: Lee_Str Источник Размещён: 12.06.2019 01:53

Ответы (2)


0 плюса

26 Репутация автора

Чтобы преобразовать оскорбительный символ или полностью удалить его, передайте 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'
Автор: John Hennig Размещён: 12.06.2019 03:07

0 плюса

85905 Репутация автора

Не зная, чего ожидать, трудно догадаться, что может быть зашифровыванием. b'\x96'декодируется как '–'(EN DASH U + 2013) в Windows cp1252 или как 'û'(LATIN SMALL LETTER U WITH CIRCUMFLEX U + 00FD) в cp850. Единственная надежда - это не UTF-8.

Поэтому я советую открыть файл в виде текста, чтобы избавиться от этих байтов, и объявить вероятную кодировку с параметром ошибки, отличным от повышения:

>>> 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'
Автор: Serge Ballesta Размещён: 12.06.2019 03:34
Вопросы из категории :
32x32