Заключение обратной косой черты в строковые литералы Python - PullRequest
50 голосов
/ 19 ноября 2008

У меня есть строка, которая содержит как двойные кавычки, так и обратную косую черту, которые я хочу установить в переменную Python. Однако всякий раз, когда я пытаюсь установить его, кавычки или слэши либо удаляются, либо экранируются. Вот пример:

>>> foo = 'baz "\"'
>>> foo
'baz ""'

Так что вместо baz "\", как я хочу, я получаю baz "". Если я попытаюсь избежать обратной косой черты, это тоже не поможет:

>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'

Что сейчас соответствует тому, что я вставил, но не то, что я изначально хотел. Как вы справляетесь с этой проблемой?

Ответы [ 4 ]

67 голосов
/ 19 ноября 2008

Вас вводят в заблуждение результатом - второй подход, который вы используете, на самом деле делает то, что вы хотите, вы просто не верите этому. :)

>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'
>>> print foo
baz "\"

Кстати, есть еще одна строковая форма, которая может быть немного понятнее:

>>> print r'baz "\"'
baz "\"
25 голосов
/ 19 ноября 2008

Использовать необработанную строку:

>>> foo = r'baz "\"'
>>> foo
'baz "\\"'

Обратите внимание, что хотя это выглядит неправильно, на самом деле это правильно. В строке есть только один обратный слеш foo.

Это происходит потому, что когда вы просто набираете foo в приглашении, python отображает результат __repr__() в строке. Это приводит к следующему (обратите внимание только на один обратный слеш и без кавычек вокруг строки print ed):

>>> foo = r'baz "\"'
>>> foo
'baz "\\"'
>>> print foo
baz "\"

И давайте продолжим, потому что есть еще трюки с обратной косой чертой. Если вы хотите иметь обратную косую черту в конце строки и использовать метод, описанный выше, вы столкнетесь с проблемой:

>>> foo = r'baz \'
  File "<stdin>", line 1
    foo = r'baz \'
                 ^  
SyntaxError: EOL while scanning single-quoted string

Необработанные строки не работают должным образом, когда вы делаете это. Вы должны использовать обычную строку и избежать обратной косой черты:

>>> foo = 'baz \\'
>>> print foo
baz \

Однако, если вы работаете с именами файлов Windows, вам не по себе. То, что вы хотите сделать, это использовать косую черту и функцию os.path.normpath():

myfile = os.path.normpath('c:/folder/subfolder/file.txt')
open(myfile)

Это спасет вас от побега и слез. Эта страница была полезна, когда проходила через некоторое время назад.

3 голосов
/ 19 ноября 2008

То, что сказал Харли, кроме последнего пункта - на самом деле нет необходимости менять '/' на 'перед вызовом open. Windows с радостью принимает пути с косой чертой.

infile = open('c:/folder/subfolder/file.txt')

Единственный случай, когда вам понадобится строка с нормой, - это если вы переходите к другой программе через оболочку (используя os.system или модуль subprocess).

0 голосов
/ 03 октября 2013

Другой способ завершить строку обратной косой чертой - завершить строку обратной косой чертой, за которой следует пробел, а затем вызвать функцию .strip() для строки.

Я пытался объединить две строковые переменные и разделить их обратной косой чертой, поэтому я использовал следующее:

newString = string1 + "\ ".strip() + string2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...