Преобразование представления шестнадцатеричной строки в фактические байты в Python

мне нужно загрузить третий столбец этого текстового файла в виде шестнадцатеричной строки

http://www.netmite.com/android/mydroid/1.6/external/skia/emoji/gmojiraw.txt

>>> open('gmojiraw.txt').read().split('\n')[0].split('\t')[2]
'\\xF3\\xBE\\x80\\x80'

как открыть файл, чтобы получить третий столбец в виде шестнадцатеричной строки:

'\xF3\xBE\x80\x80'

Я также пробовал двоичный режим и шестнадцатеричный режим, но безуспешно.


person kevin    schedule 19.08.2010    source источник


Ответы (5)


Вы можете:

  1. Удалите \x-es
  2. Используйте .decode('hex') для полученной строки

Код:

>>> '\\xF3\\xBE\\x80\\x80'.replace('\\x', '').decode('hex')
'\xf3\xbe\x80\x80'

Обратите внимание на соответствующую интерпретацию обратной косой черты. Когда строковое представление '\xf3', это означает, что это однобайтовая строка со значением байта 0xF3. Когда это '\\xf3', что является вашим вводом, это означает строку, состоящую из 4 символов: \, x, f и 3

person Eli Bendersky    schedule 19.08.2010
comment
вау, спасибо, сработало, stackoverflow не позволяет мне принять это как ответ прямо сейчас! - person kevin; 19.08.2010
comment
@kevin: я не уверен, почему это так, но не спешите. Люди могут придумать лучшие ответы, чем этот. Вы всегда можете принять его позже (т.е. через пару дней) - person Eli Bendersky; 19.08.2010
comment
он сказал, что я должен подождать не менее 10 минут, прежде чем принять ответ. хорошо, я буду ждать, чтобы принять ответ! но я сомневаюсь, что какой-либо другой ответ может улучшить этот - person kevin; 19.08.2010
comment
decode('hex') не работает для Python3, но если вам нужен ответ Python2, это хороший ответ - person John La Rooy; 19.08.2010

Быстрый и грязный ответ

your_string.decode('string_escape')

>>> a='\\xF3\\xBE\\x80\\x80'
>>> a.decode('string_escape')
'\xf3\xbe\x80\x80'
>>> len(_)
4

Информация о бонусе

>>> u='\uDBB8\uDC03'
>>> u.decode('unicode_escape')

Некоторые мелочи

Что интересно, у меня есть Python 2.6.4 на Karmic Koala Ubuntu (sys.maxunicode==1114111) и Python 2.6.5 на Gentoo (sys.maxunicode==65535); в Ubuntu результатом unicode_escape-decode является \uDBB8\uDC03, а в Gentoo — u'\U000fe003', обе правильно длины 2. Если только это не исправлено между 2.6.4 и 2.6.5, я впечатлен 2-байтовым символом юникода в Gentoo. версия сообщает правильный символ.

person tzot    schedule 18.09.2010
comment
\Uxxxxxxxx vs \uxxxx\uxxxx, по-видимому, является параметром времени сборки, представленным в Python 2.6. В узких сборках кодовые точки за пределами BMP представлены как суррогатные пары UTF-16. См. косвенно проблему № 1477. - person tripleee; 23.09.2014

Если вы используете Python 2.6+, вот безопасный способ использования eval

>>> from ast import literal_eval
>>> item='\\xF3\\xBE\\x80\\x80'
>>> literal_eval("'%s'"%item)
'\xf3\xbe\x80\x80'
person John La Rooy    schedule 19.08.2010
comment
+1: для поддержки Python 3, плюс мне нравится, как это также работает, если не все байты экранированы, например, он отлично преобразует «hello\\x00world». - person Scott Griffiths; 19.08.2010

После удаления «\ x» в качестве ответа Эли вы можете просто сделать:

int("F3BE8080",16)
person neil    schedule 19.08.2010

Если вы доверяете источнику, вы можете использовать eval('"%s"' % data)

person Community    schedule 19.08.2010