【问题标题】:Why do I only have to escape the last backslash in a string literal?为什么我只需要转义字符串文字中的最后一个反斜杠?
【发布时间】:2020-04-19 14:37:43
【问题描述】:

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

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

【问题讨论】:

  • 因为 `\` 正在转义它后面的双引号 - 所以你的字符串格式不正确

标签: python python-3.x escaping python-3.7 string-literals


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    为什么我只需要转义最后一个\?

    因为只有在最后一个 \ 之后有一个符号 ("),它与 ​​\ 一起构成一个转义序列 — \"(转义引号符号@ 987654325@ 作为字符串终止符)。

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

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


    一个(不请自来的)解决方案:

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

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

    【讨论】:

      【解决方案3】:

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

      但要具体回答您关于为什么问题只存在于最后一个而不存在于前面的反斜杠的问题,您应该查看string literals 的定义。

      您会看到有一个(简短的)字符列表,反斜杠对其进行了特殊处理。其余的,反斜杠被当作它自己。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-24
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多