Почему мне нужно экранировать только последний backsla sh в строковом литерале? - PullRequest
1 голос
/ 19 апреля 2020

У меня есть следующий Python код:

localExtractpath = "D:\Python\From 0 to 1\Excel\"
if os.path.exists(localZipPath):
    print("Cool! '" + localZipPath + "' exists...proceeding...")

Это дает мне ошибку:

File "", line 2
    localExtractpath = "D:\Python\From 0 to 1\Excel\"
                                                 ^
SyntaxError: EOL while scanning string literal

Когда я экранирую последний \ в строке, код работает. Почему мне нужно бежать только из последних \?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2020

Последняя обратная коса sh в "D:\Python\From 0 to 1\Excel\" экранирует вашу конечную кавычку, поэтому в глазах переводчика ваша строка не определена. Фактически, вы должны избежать всех своих обратных слешей, если вы хотите использовать в своей строке буквальную обратную косую черту sh:

"D:\\Python\\From 0 to 1\\Excel\\"

1 голос
/ 19 апреля 2020

Почему мне нужно бежать только от последнего \?

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

Если \ с последующим (и) символом (ами) don не образует escape-последовательность , она сохраняется как есть, т.е. как сам символ backsla sh.

(В вашем случае ни \P, ни \F и \E не образуют разрешенную escape-последовательность, поэтому сам символ \ интерпретируется буквально - как есть.)


(незапрошенное) решение:

Используйте прямую косую черту (/) вместо обратной косой черты (\) (все системные вызовы Windows также принимают их):

localExtractpath = "D:/Python/From 0 to 1/Excel/"
0 голосов
/ 19 апреля 2020

Другие ответы верны: вам следует избегать всех обратных наклонных слешей и, что еще лучше, вы должны использовать forward sla sh для элементов пути (вы даже можете взглянуть на библиотеку pathlib ).

Но чтобы конкретно ответить на ваш вопрос о том, почему проблема заключается только в последней, а не в предыдущих обратных косых чертах, вам следует взглянуть на определение строковых литералов .

Вы увидите, что существует (короткий) список символов, для которых обратная коса sh делает что-то особенное. В остальном обратная коса sh берется как сама.

Например, "\n" интерпретируется не как строка с двумя символами (\ и n), а как строка только с символ перевода строки. Это не относится к "\P", "\F" или "\E", каждый из которых состоит из двух символов, поскольку они не имеют определенного значения c.

\" и \' являются особенными тем, что они позволяют соответственно вставить символ " или ' в строковый литерал, ограниченный этим же символом. Например, 'single: \', double "' и "single: ', double: \"" - это два способа определения строкового литерала single: ', double ".

...