2012-02-18 2 views
6

Скажем, у меня есть строка в Python 3.2 вроде этого:неэкранированными экранированные символы в строку, используя Python 3.2

'\n' 

Когда я печатаю() это на консоль, он показывает как новая линия, очевидно. Я хочу, чтобы иметь возможность печатать его буквально как обратную косую черту, за которой следует n. Кроме того, мне нужно сделать это для всех экранированных символов, таких как \ t. Поэтому я ищу для функции экранирования в(), что, в общем случае, будет работать следующим образом:

>>> s = '\n\t' 
>>> print(unescape(s)) 
'\\n\\t' 

Возможно ли это в Python без построения словаря уцелевших символов их буквенных замен?

(В случае, если кому-то интересно, почему я делаю это потому, что мне нужно передать строку на внешнюю программу из командной строки Эта программа понимает все стандартные управляющие последовательности.).

+0

Когда вы говорите «один из командной строки» Я предположим, что вы на самом деле имеете в виду через stdout, и в этом случае программа, с которой вы передаете данные, должна потреблять '\ n' и т. д. без каких-либо проблем. То есть, если вы напечатали данные после того, как они были переданы в эту вторую программу, вы увидите, что '\ n' все равно будет там. Если вы действительно не хотите этого избежать. Но сначала проверьте, если вы просто удалите лишнюю '\' во второй программе, вы, вероятно, ошибаетесь. – Endophage

+0

У меня есть программа командной строки, называемая myutility. Он ожидает, что будет называться вот так: 'myutility -i \ n' Если я не отменяю строку, тогда он никогда не увидит, что \ n будет передан ему - он будет считать -i пустой аргумент. –

ответ

11

Для предотвращения специальной обработки \ в литеральной строке вы можете использовать префикс r:

s = r'\n' 
print(s) 
# -> \n 

Если у вас есть строка, которая содержит символ новой строки (ord(s) == 10), и вы хотели бы, чтобы преобразовать его в форму, пригодную как Python буквальным:

s = '\n' 
s = s.encode('unicode-escape').decode() 
print(s) 
# -> \n 
+0

awesome, очень полезный и хороший пример кодирования/декодирования – OregonTrail

5

Edit: Основываясь на вашем последнем замечании, вы, вероятно, захотите получить от Unicode некоторое кодированное представление. Это один из способов:

>>> s = '\n\t' 
>>> s.encode('unicode-escape') 
b'\\n\\t' 

Если вы их не нужно экранировать затем использовать кодировку системы, например:

>>> s.encode('utf8') 
b'\n\t' 

Вы можете использовать это в подпроцесс:

import subprocess 
proc = subprocess.Popen([ 'myutility', '-i', s.encode('utf8') ], 
         stdout=subprocess.PIPE, stdin=subprocess.PIPE, 
         stderr=subprocess.STDOUT) 
stdout,stderr = proc.communicate() 
+2

Хотя 'repr()' действительно привлекательно, это _might_ не будет точно тем, что предназначено, так как это фактически выводит строку, содержащую одинарные кавычки, поэтому вы получите что-то вроде '' '\\ n \\ r «" '. – voithos

+0

My Python оценивает это как «'\\ n \\ t'" Думаю, я могу просто снять первый и последний персонажи ...? –

+2

@MikeyCee: см. Править для лучшего варианта. – bernie

Смежные вопросы