Python中类似的C字符串格式
我需要读取带有一些奇怪字符串行的文件,如:\x72\xFE\x20TEST\u string\0\0\0 但是当我打印这个字符串时(使用repr()),它会打印:r\xfe TEST\u string\x00\x00\x00 例如:Python中类似的C字符串格式,python,encoding,Python,Encoding,我需要读取带有一些奇怪字符串行的文件,如:\x72\xFE\x20TEST\u string\0\0\0 但是当我打印这个字符串时(使用repr()),它会打印:r\xfe TEST\u string\x00\x00\x00 例如: >>> test = '\x72\xFE\x20TEST_STRING\0\0\0' >>> print test r? TEST_STRING >>> print repr(test) 'r\xfe TEST_
>>> 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是否在字符串操作期间更改编码?您应该使用python的原始字符串,如下所示(注意字符串前面的“r”) 那么它就不会试图把逃逸行为解释为特殊的角色 在读取文本文件时,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
您应该使用python的原始字符串,如下所示(注意字符串前面的“r”) 那么它就不会试图把逃逸行为解释为特殊的角色 在读取文本文件时,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
\x20
是一个空格。当您将其放入Python字符串时,它的存储方式与空格完全相同
如果字符串中有可打印字符,则无论它们是作为实际字符还是某种转义序列键入的,它们都将以相同的方式表示,因为它们实际上是相同的值
考虑以下示例:
>>> ' ' == '\x20'
True
>>> hex(ord('a'))
'0x61'
>>> '\x61'
'a'
\x20
是一个空格。当您将其放入Python字符串时,它的存储方式与空格完全相同
如果字符串中有可打印字符,则无论它们是作为实际字符还是某种转义序列键入的,它们都将以相同的方式表示,因为它们实际上是相同的值
考虑以下示例:
>>> ' ' == '\x20'
True
>>> hex(ord('a'))
'0x61'
>>> '\x61'
'a'
Python没有更改编码: 在打印Python时,您刚刚解析了字符串中的可打印字符:
chr(0x72)
是一个“r”;chr(0xfe)
是不可打印的,因此您得到了“?”,chr(0x20)
是chr(32)
这是一个空格“”,并且零字节根本不打印
repr()
解析“r”,保留chr(0xfe)
,并以chr(0x00)
的完整十六进制表示法打印chr(0)
因此,如果您希望在编辑器中使用与repr()
相同的行,则必须在编辑器中使用与repr()
相同的符号键入字符串,即您编写的字符串
test='r\xfe TEST_STRING\x00\x00\x00'
和
repr(test)
应打印相同的字符串:Python未更改编码:
在打印Python时,您刚刚解析了字符串中的可打印字符:chr(0x72)
是一个“r”;chr(0xfe)
是不可打印的,因此您得到了“?”,chr(0x20)
是chr(32)
这是一个空格“”,并且零字节根本不打印
repr()
解析“r”,保留chr(0xfe)
,并以chr(0x00)
的完整十六进制表示法打印chr(0)
因此,如果您希望在编辑器中使用与repr()
相同的行,则必须在编辑器中使用与repr()
相同的符号键入字符串,即您编写的字符串
test='r\xfe TEST_STRING\x00\x00\x00'
和
repr(test)
应打印相同的字符串:为了避免python将反斜杠解释为转义字符,请在字符串前面加上“r”字符:
>>> test = r'\x72\xFE\x20TEST_STRING\0\0\0'
>>> print test
\x72\xFE\x20TEST_STRING\0\0\0`
为了避免python将反斜杠解释为转义字符,请在字符串前面加上“r”字符:
>>> test = r'\x72\xFE\x20TEST_STRING\0\0\0'
>>> print test
\x72\xFE\x20TEST_STRING\0\0\0`
您是否在问为什么
print s
的输出与print repr
的输出不同?您的文件中实际有什么内容?你确定吗?你是怎么核实的<字符串文字中的code>'\x72'并不表示“反斜杠、字母x、数字7和数字2”;它的意思是“其值在十六进制中写为'72'的字节,即114,恰好是字母r”。您是否在问print s
的输出为什么与print repr(s)
的输出不同?您的文件中实际有什么?你确定吗?你是怎么核实的<字符串文字中的code>'\x72'并不表示“反斜杠、字母x、数字7和数字2”;它的意思是“其值以十六进制写成'72'的字节,即114,正好是字母r”。