Python中类似的C字符串格式

时间:2011-08-26 17:35:48

标签: python encoding

我需要读取一些带有一些奇怪字符串的文件,例如:\ 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是否在字符串操作期间改变编码?

4 个答案:

答案 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`