为什么我只需要转义字符串文字中的最后一个反斜杠?

Why do I only have to escape the last backslash in a string literal?

我有以下 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

当我转义字符串中的最后一个 \ 时,代码有效。为什么我只需要转义最后一个\?

"D:\Python\From 0 to 1\Excel\" 中的最后一个反斜杠转义了结束引号,因此在解释器看来,您的字符串未终止。事实上,如果您想在字符串中使用文字反斜杠,则必须转义所有反斜杠:

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

Why do I only have to escape the last \?

因为只有在最后一个\之后有一个符号(")和\一起组成了一个转义序列\"(将引号 " 转义为字符串终止符)。

如果 \ 与后续符号 不形成转义序列,则保持 原样,即作为反斜杠符号本身。

(在您的情况下,\P\F\E 均不构成允许的转义序列,因此符号 \ 本身按字面解释 - 原样.)


一个(主动提供的)解决方案:

使用 正斜杠 (/) 而不是反斜杠 (\) (所有 Windows 系统调用也接受它们):

localExtractpath = "D:/Python/From 0 to 1/Excel/"

其他答案是正确的:您应该转义所有反斜杠,更好的是,您应该对路径元素使用正斜杠(您甚至可以查看 pathlib 库)。

但是要具体回答您的问题,即为什么问题只存在于最后一个反斜杠中而不存在于之前的反斜杠中,您应该查看 string literals.

的定义

您会看到有一个(简短的)字符列表,反斜杠使其具有特殊意义。其余的,反斜杠本身。

例如 "\n" 不被解释为具有两个字符(\n)的字符串,而是被解释为只有一个换行符的字符串。 "\P""\F""\E" 不是这种情况,每个都是两个字符,因为它们没有特定含义。

\"\' 的特殊之处在于它们允许在由相同字符分隔的字符串文字中分别插入 "' 字符。 例如,'single: \', double "'"single: ', double: \"" 是定义 single: ', double " 字符串文字的两种方式。