“EOL while scanning single-quoted string” (字符串中的反斜杠) 是什么意思?

7
import os
xp1 = "\Documents and Settings\"
xp2 = os.getenv("USERNAME")
print xp1+xp2

给我报错了。
 File "1.py", line 2 
xp1 = "\Documents and Settings\"
                               ^
SyntaxError: EOL while scannning single-quoted string

请问能否帮我看一下问题?

这个问题与IT技术有关。

请问您能否将问题重命名为更有意义的名称? - SilentGhost
1
还要注意 Stack Overflow 如何自动着色您的代码,以便问题变得明显。 - ilya n.
7个回答

23

反斜杠字符被解释为转义符。在 Windows 路径中使用双反斜杠:

>>> xp1 = "\\Documents and Settings\\"
>>> xp1
'\\Documents and Settings\\'
>>> print xp1
\Documents and Settings\
>>> 

11

除了反斜杠的问题外,不要使用“+”操作符连接路径--而是使用os.path.join

此外,像这样构建用户主目录的路径可能会在新版本的Windows上失败。在pywin32中有API函数可用于解决此问题。


1
+1 os.path.join 是一个好的选择。os.getenv('HOME') 在 Win32 上被设置了吗?我没有 MS 电脑来检查。 - James Brady
我的虚拟机里的可怜XP系统有一个名为“USERPROFILE”的环境变量,它指向主目录,但我不确定它是否官方认可。 - Torsten Marek

8
你可以使用os.path.expanduser函数来获取用户主目录的路径。它甚至不需要是一个已存在的用户。
>>> import os.path
>>> os.path.expanduser('~foo')
'C:\\Documents and Settings\\foo'
>>> print os.path.expanduser('~foo')
C:\Documents and Settings\foo
>>> print os.path.expanduser('~')
C:\Documents and Settings\MizardX

"~user"会被扩展为用户的主目录路径。只有一个"~"会被扩展为当前用户的主目录。

+1,在Windows 7上正常工作,其中路径为C:\Users\foo - Mark Tolonen

6

作为许多其他语言一样,Python使用反斜杠作为转义字符(因此您的xp1=...行末尾的双引号被视为字符串的一部分,而不是字符串的定界符)。

这实际上是相当基础的东西,所以我强烈建议在继续之前阅读Python教程

您可能对raw字符串感兴趣,它们不会转义反斜杠。只需在字符串之前添加r

xp1 = r"\Documents and Settings\"

此外,在操作文件路径时,您应该使用os.path模块,它将根据程序运行的操作系统使用“/”或“\”。例如:
import os.path
xp1 = os.path.join("data","cities","geo.txt")

在Linux上会生成"data/cities/geo.txt",在Windows上会生成"data\cities\geo.txt"。


2
一个原始字符串不能以奇数个反斜杠结尾。试一下。 - Mark Tolonen

5
\"被解释为“在字符串中插入一个双引号”,因此您缺少字符串文字的终止引号。请注意,原始字符串r"\"也无法解决这个问题。
以下是摘自文档的引用(粗体字是我的):
当存在'r'或'R'前缀时,后面跟随反斜杠的字符将包含在字符串中且不会更改,并且所有反斜杠均保留在字符串中。例如,字符串文字r"\n"由两个字符组成:反斜杠和小写字母'n'。字符串引号可以用反斜杠转义,但反斜杠仍保留在字符串中;例如r"\""是有效的字符串文本,由两个字符组成:反斜杠和双引号;r"\"不是有效的字符串文字(即使原始字符串以奇数个反斜杠结尾也不行)。特别地,原始字符串不能以单个反斜杠结尾(因为反斜杠会转义后面的引号字符)。还要注意,单个反斜杠后跟换行符将被解释为该字符串的两个字符,而不是行继续符。
无论如何,@MizardX给出的答案都是正确的方式来编写您正在执行的操作。

1
我遇到了同样的错误,读了@Mark Tolonen的评论后解决了这个问题。
这是一个错误的路径字符串:
xp1 = "\Documents and Settings\"

这是一个正确的路径字符串,没有最后的反斜杠:

xp1 = "\Documents and Settings"

0

在Windows中

for file in glob.glob('C:\Users\7000020370\3D Objects\audio\data\*\*'):
    print(file.split("\\")[0])

这个会抛出错误,但下面这个不会

for file in glob.glob(r'C:\Users\7000020370\3D Objects\audio\data\*\*'):
    print(file.split("\\")[0])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接