Подобный формат строки C в Python - PullRequest
0 голосов
/ 26 августа 2011

Мне нужно прочитать файл с некоторыми странными строковыми строками, такими как: \ 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 ]

1 голос
/ 26 августа 2011

\x20 это пробел. Когда вы помещаете это в строку Python, оно сохраняется точно так же, как и пробел.

Если у вас есть печатаемые символы в строке, не имеет значения, были ли они введены в качестве фактического символа или какой-либо escape-последовательности, они будут представлены одинаково, поскольку на самом деле они имеют одинаковое значение.

Рассмотрим следующие примеры:

>>> ' ' == '\x20'
True

>>> hex(ord('a'))
'0x61'
>>> '\x61'
'a'
1 голос
/ 26 августа 2011

Python не изменил кодировку:

При печати Python только что разрешил печатные символы в вашей строке: chr(0x72) - это «r», chr(0xfe) - не для печати, так что вы получаете «?", chr(0x20) равно chr(32), что является пробелом" ", и нулевые байты не печатаются вообще.

repr() разрешает" r ", оставляет chr(0xfe) и печатает chr(0) в полном шестнадцатеричном формате для chr(0x00).

Так что, если вы хотите одну и ту же строку в вашем редакторе и для repr(), вы должны ввести свою строку в вашем редакторе в той же записи, что и 1016 *, то есть вы пишете

test='r\xfe TEST_STRING\x00\x00\x00'

и repr(test) должны печатать одну и ту же строку:

1 голос
/ 26 августа 2011

Вы должны использовать необработанные строки Python, например так (обратите внимание на 'r' перед строкой)

test = r'\x72\xFE\x20TEST_STRING\0\0\0'

Тогда он не будет пытаться интерпретировать экранирование как специальные символы.

При чтении из текстового файла python не должен пытаться интерпретировать строку как имеющую многобайтовые символы Юникода.Вы должны получить именно то, что находится в файле:

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
0 голосов
/ 26 августа 2011

Чтобы Python не интерпретировал обратные слэши как экранированные символы, добавьте в строку префикс «r»:

    >>> test = r'\x72\xFE\x20TEST_STRING\0\0\0'
    >>> print test
    \x72\xFE\x20TEST_STRING\0\0\0`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...