Одна строка байта, содержащая Hex: как преобразовать в строку - PullRequest
0 голосов
/ 12 июня 2019

Я использую 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
>>>

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Не зная, чего ожидать, трудно догадаться, что может быть зашифровыванием. 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'
0 голосов
/ 12 июня 2019

Чтобы преобразовать нарушающий символ или полностью удалить его, передайте 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'
...