Вопрос-Ответ

How can I put an actual backslash in a string literal (not use it for an escape sequence)?

Как я могу поместить фактическую обратную косую черту в строковый литерал (не использовать ее для escape-последовательности)?

У меня есть этот код:

import os
path = os.getcwd()
final = path +'\xulrunner.exe ' + path + '\application.ini'
print(final)

Я хочу выводить как:

C:\Users\me\xulrunner.exe C:\Users\me\application.ini

Но вместо этого я получаю ошибку, которая выглядит как:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \xXX escape

Я не хочу, чтобы обратные косые черты интерпретировались как escape-последовательности, а как буквальные обратные косые черты. Как я могу это сделать?


Обратите внимание, что если строка должна только содержать обратную косую черту - в более общем смысле, должна иметь нечетное количество обратных косых черт в конце - тогда необработанные строки нельзя использовать. Пожалуйста, используйте Как я могу получить строку с одной обратной косой чертой в ней? чтобы закрыть вопросы, которые запрашивают строку только с обратной косой чертой в ней. Используйте Как писать строковые литералы в python без необходимости экранировать их? когда вопрос конкретно касается желания избежать необходимости в escape-последовательностях.

Переведено автоматически
Ответ 1

Чтобы ответить на ваш вопрос напрямую, поставьте r перед строкой.

final= path + r'\xulrunner.exe ' + path + r'\application.ini'

Но лучшим решением было бы os.path.join:

final = os.path.join(path, 'xulrunner.exe') + ' ' + \
os.path.join(path, 'application.ini')

(обратная косая черта там экранирует новую строку, но вы могли бы поместить все это в одну строку, если хотите)

Я упомяну, что вы можете использовать прямые косые черты в путях к файлам, и Python автоматически преобразует их в правильный разделитель (обратную косую черту в Windows) по мере необходимости. Итак

final = path + '/xulrunner.exe ' + path + '/application.ini'

должно сработать. Но все же предпочтительнее использовать os.path.join потому что это проясняет, что вы пытаетесь сделать.

Ответ 2

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

Ответ 3

Вы можете экранировать обратную косую черту другой обратной чертой (\\), но это не будет выглядеть лучше. Чтобы решить эту проблему, поставьте r перед строкой, чтобы обозначить необработанную строку. Необработанная строка будет игнорировать все escape-последовательности, рассматривая обратную косую черту как буквенный текст. Он не может содержать закрывающую кавычку, если перед ней не стоит обратная косая черта (которая будет включена в строку), и он не может заканчиваться одной обратной косой чертой (или нечетным количеством обратных косых черт).

Ответ 4

Другой простой (и, возможно, более читаемый) подход заключается в использовании формата string raw и замен, подобных этому:

import os
path = os.getcwd()
final = r"{0}\xulrunner.exe {0}\application.ini".format(path)
print(final)

или используя метод os path (и микрофункцию для удобства чтения):

import os

def add_cwd(path):
return os.path.join( os.getcwd(), path )

xulrunner = add_cwd("xulrunner.exe")
inifile = add_cwd("application.ini")
# in production you would use xulrunner+" "+inifile
# but the purpose of this example is to show a version where you could use any character
# including backslash
final = r"{} {}".format( xulrunner, inifile )
print(final)
2023-09-07 20:30 python string