читать \xHH выходит из файла как необработанный двоичный файл в Python

У меня следующая проблема:

Я хочу прочитать из файла в необработанную двоичную строку:

Файл выглядит так (с escape-символами, а не с двоичными данными):

\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30\x8b\x52

используемый код:

данные = открыть ("имя файла", "rb"). читать()

полученный результат:

б"\\xfc\\xe8\\x82\\x00\\x00\\x00\\x60\\x89\\xe5\\x31\\xc0\\x64\\x8b\\x50\\x30\\x8b \\х52"

С добуле \ .

Как я могу прочитать его как двоичную строку, например: \xaa символов? (Без escape-символов)


person Symonen    schedule 01.05.2016    source источник
comment
Является ли ваш файл двоичным, представленным в том виде, как вы говорите, или это фактически то, что вы нам показываете, это ascii, и вы хотите его интерпретировать?   -  person cge    schedule 01.05.2016
comment
Строка читается правильно, обратная косая черта представлена ​​​​в строках Python с использованием escape-последовательности '\\'. Когда вы печатаете неформатированную строку (с префиксом b), отображаются символы управляющей последовательности. Добавьте больше деталей к вопросу о том, как вы планируете использовать строку, чтобы получить более полезные ответы.   -  person Nitin Labhishetty    schedule 01.05.2016
comment
это простой текстовый файл, который я должен написать, извините.   -  person Symonen    schedule 01.05.2016


Ответы (3)


Ok. Ваша проблема в том, что вы задаете неправильный вопрос. Ваш файл данных представляет собой не необработанную двоичную строку, а закодированную, закодированную с помощью escape-символов. Однако вы читаете его как необработанный двоичный файл, когда вместо этого вам нужно декодировать escape-последовательности. Пытаться

data = open("filename", "r", encoding='unicode_escape').read().encode('raw_unicode_escape')

вместо.

Изменить: хорошо, теперь это работает. Вам нужно кодировать в raw_unicode_escape, а не в utf-8 (по умолчанию).

person cge    schedule 01.05.2016
comment
Да, мой вопрос неверен, извините за это. Но ваше решение работает. Большое спасибо. - person Symonen; 01.05.2016

Этот вывод в порядке.

Python выводит эти данные с двойной обратной косой чертой, чтобы показать, что они непечатаемые. Однако он хранится правильно, как байты.

person ForceBru    schedule 01.05.2016
comment
Не совсем так, когда я хочу использовать его, я получаю ошибку. Если я добавлю в свой код следующее: data = b\xaa\xaa\xaa Работает, но когда я читаю его из файла, как указано выше, я получаю ошибку - person Symonen; 01.05.2016
comment
@Symonen, какой?? - person ForceBru; 01.05.2016
comment
не путайте b'\\xfc' (4 байта) и b'\xfc' (1 байт). - person jfs; 15.01.2017

Чтобы преобразовать 4 символа ascii (\ x f c) из файла в один байт (252==0xfc), вы можете прочитать символы ascii как байты (data = open("filename", "rb").read()), удалить префикс \x и преобразовать полученную шестнадцатеричную строку байтов в bytes, содержащую соответствующие необработанные двоичные данные:

>>> import binascii
>>> data = b'\\xfc\\xe8\\x82'
>>> binascii.unhexlify(data.replace(b'\\x', b''))
b'\xfc\xe8\x82'

Во-первых, лучше избегать хранения данных как b'\\xfc' (4 байта) вместо b'\xfc' (1 байт).

person jfs    schedule 15.01.2017