我需要读取一些带有一些奇怪字符串的文件,例如:\ x72 \ xFE \ x20TEST_STRING \ 0 \ 0 \ 0
但是当我打印这个字符串(使用repr())时会打印出来:r \ xfe TEST_STRING \ x00 \ x00 \ x00
示例:
>>> test = '\x72\xFE\x20TEST_STRING\0\0\0'
>>> print test
r? TEST_STRING
>>> print repr(test)
'r\xfe TEST_STRING\x00\x00\x00'
如何从Python和我的编辑器中的文件中获取相同的行? python是否在字符串操作期间改变编码?
答案 0 :(得分:1)
你应该使用python的原始字符串,如下所示(注意字符串前面的'r')
test = r'\x72\xFE\x20TEST_STRING\0\0\0'
然后它不会尝试将转义解释为特殊字符。
从文本文件中读取时,python不应该尝试将字符串解释为具有多字节unicode字符。你应该得到文件中的确切内容:
In [22]: fp = open("test.txt", "r")
In [23]: s = fp.read()
In [24]: s
Out[24]: '\\x72\\xFE\\x20TEST_STRING\\0\\0\\0\n\n'
In [25]: print s
\x72\xFE\x20TEST_STRING\0\0\0
答案 1 :(得分:1)
\x20
是一个空间。当你把它放入Python字符串时,它的存储方式与空格完全相同。
如果字符串中有可打印的字符,无论它们是作为实际字符还是某些转义序列键入都无关紧要,它们将以相同的方式表示,因为它们实际上是相同的值。
请考虑以下示例:
>>> ' ' == '\x20'
True
>>> hex(ord('a'))
'0x61'
>>> '\x61'
'a'
答案 2 :(得分:1)
Python没有改变编码:
打印Python时,只解析了字符串中的可打印字符:chr(0x72)
是“r”,chr(0xfe)
不可打印,因此您获得“?”,chr(0x20)
为{ {1}}这是一个空格“”,根本不打印零字节。
chr(32)
解析“r”,离开repr()
,并以chr(0xfe)
的完整十六进制表示法打印chr(0)
。
因此,如果您想在编辑器和chr(0x00)
中使用相同的行,则必须使用相同的符号repr()
在编辑器中键入字符串,即编写
repr()
和test='r\xfe TEST_STRING\x00\x00\x00'
应该打印相同的字符串:
答案 3 :(得分:0)
为避免让python将反斜杠解释为转义字符,请在字符串前加上“r”字符:
>>> test = r'\x72\xFE\x20TEST_STRING\0\0\0'
>>> print test
\x72\xFE\x20TEST_STRING\0\0\0`