在Python中将十六进制字符串表示转换为实际字节

kev*_*vin 6 python hex representation

我需要将此文本文件的第三列作为十六进制字符串加载

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'
Run Code Online (Sandbox Code Playgroud)

我如何打开文件,以便我可以将第三列作为十六进制字符串:

'\xF3\xBE\x80\x80'
Run Code Online (Sandbox Code Playgroud)

我也试过二进制模式和十六进制模式,没有成功.

Eli*_*sky 7

您可以:

  1. 删除\x-es
  2. 在结果字符串上使用.decode('hex')

码:

>>> '\\xF3\\xBE\\x80\\x80'.replace('\\x', '').decode('hex')
'\xf3\xbe\x80\x80'
Run Code Online (Sandbox Code Playgroud)

请注意反斜杠的相应解释.当字符串表示为'\ xf3'时,表示它是一个字节值为0xF3的单字节字符串.当它是"\\ XF3",这是你的输入,这意味着一个字符串组成的4个字符:\,x,f3

  • decode('hex')对Python3不起作用,但是如果你需要Python2答案,这是一个很好的答案 (2认同)

tzo*_*zot 7

Quick'n'dirty回复

your_string.decode('string_escape')

>>> a='\\xF3\\xBE\\x80\\x80'
>>> a.decode('string_escape')
'\xf3\xbe\x80\x80'
>>> len(_)
4
Run Code Online (Sandbox Code Playgroud)

奖金信息

>>> u='\uDBB8\uDC03'
>>> u.decode('unicode_escape')
Run Code Online (Sandbox Code Playgroud)

一些琐事

有趣的是,我在Karmic Koala Ubuntu(sys.maxunicode==1114111)上使用Python 2.6.4,在Gentoo(sys.maxunicode==65535)上使用Python 2.6.5 ; 在Ubuntu上,unicode_escape-decode结果是\uDBB8\uDC03和Gentoo一样u'\U000fe003',两者都是正确的长度2.除非它在2.6.4和2.6.5之间固定,我印象深刻的是每个unicode字符的2字节Gentoo版本报告正确的角色.


Joh*_*ooy 5

如果您使用的是Python2.6 +,这是一种使用eval的安全方法

>>> from ast import literal_eval
>>> item='\\xF3\\xBE\\x80\\x80'
>>> literal_eval("'%s'"%item)
'\xf3\xbe\x80\x80'
Run Code Online (Sandbox Code Playgroud)