我使用一个变量来存储由套接字发送的数据。当我在程序中分配它时,它可以工作,但是当我从文件中读取它时,它被视为字符串。
Example:
data = '\x31\x32\x33'
print data
Outputs
123 # <--- this is the result I want when I read from a file to assign data
f = open('datafile') <--- datafile contains \x31\x32\x33 on one line
data = f.readline()
print data
Outputs
\x31\x32\x33 # <--- wanted it to print 123, not \x31\x32\x33.
在 Python 中,字符串'\x31\x32\x33'
实际上只有三个字符'\x31'
是序数为 0x31 (49) 的字符,所以'\x31'
相当于'1'
。听起来你的文件实际上包含 12 个字符\x31\x32\x33
,相当于Python字符串'\\x31\\x32\\x33'
,其中转义的反斜杠表示单个反斜杠字符(也可以用原始字符串文字表示r'\x31\x32\x33'
).
如果您确实确定该数据应该是'123'
,那么您需要查看该文件是如何写入的。如果这是您可以控制的事情,那么您应该在那里解决它,这样您就不会得到由表示十六进制转义的多个字节组成的数据。
也有可能写入此数据的任何内容都已经使用某种数据交换格式(类似于 JSON),在这种情况下,您不需要更改它的写入方式,您只需要使用该数据的解码器 -交换格式(如json.loads()
,但这不是 JSON)。
如果不知何故,以上都不是您真正想要的,而您只想弄清楚如何转换字符串,例如r'\x31\x32\x33'
to '123'
在 Python 中,您可以这样做:
>>> r'\x31\x32\x33'.decode('string_escape')
'123'
或者在 Python 3.x 中:
>>> br'\x31\x32\x33'.decode('unicode_escape')
'123'
edit:根据评论,看起来您实际上得到了十六进制字符串,例如'313233'
,将这样的字符串转换为'123'
您可以使用十六进制解码:
>>> '313233'.decode('hex')
'123'
或者在 Python 3.x 上:
>>> bytes.fromhex('313233').decode('utf-8')
'123'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)