我今天了解到,在Windows上的python中,执行os.chdir('f:\\')
与执行os.chdir('f:')
的过程非常不同。带有反斜杠的命令实际上会更改当前目录。没有反斜杠,该命令就像在命令提示符下键入f:
,并将当前目录更改为f
驱动器上的最后一个当前目录。
这是一个例子:
import time
import os
if __name__ == '__main__':
os.chdir('f:\\directory')
print 'cwd is {}'.format(os.getcwd())
os.chdir('d:\\directory')
print 'cwd is {}'.format(os.getcwd())
os.chdir('f:')
print 'cwd is {}'.format(os.getcwd())
os.chdir('f:\\')
print 'cwd is {}'.format(os.getcwd())
打印
cwd is f:\directory
cwd is d:\directory
cwd is f:\directory
cwd is f:\
我可以理解为什么这种区别有用,但是找不到任何记录这种行为的记录。我已经习惯于在目录中留下斜线,因为我通常在这里使用字符串...
此行为是否记录在任何地方?我可以依靠它不变吗?
答案 0 :(得分:6)
这不是Python功能,而是Windows的常规功能。
在Windows上,每个驱动器均会跟踪其当前的工作目录。因此,实际上,“当前工作目录”是当前驱动器的当前工作目录。
chdir('F:')
将驱动器更改为F
,但不更改F的工作目录,因此最终更改为F
驱动器的当前目录。
chdir('F:\\')
将驱动器更改为F
,并将F
的工作目录更改为其根目录,因此最终更改为{{1 }}驱动器。
它也不特定于F
。任何处理路径名的函数,甚至是chdir
,都将以这种方式起作用。
* {open
”将在F驱动器的当前工作目录(即使当前驱动器为C)中打开文件open('F:spam.txt')
。 (这与DOS风格工具的工作方式一致。)
* spam.txt
在F驱动器的根目录中打开文件open('F:\\spam.txt')
。
某些跨平台工具试图假装驱动器是顶级安装点,因此spam.txt
就像cd F:
,而 does 转到{ {1}}。这具有使程序的本机Windows版本和Cygwin版本工作非常相似的优点,但是使程序无法像传统DOS风格的程序一样工作的缺点。通常,更多的工具可以像Python一样处理事情-它为您提供了更大的灵活性,并且通常不会造成混乱。
您在评论中添加的内容:
除了“我可以依靠它而不改变”之外,我的意思是谁可以说出微软在其新发布的“改进”控制台中将打破什么。
好吧,这种行为可以回溯到……我认为PC-DOS 2.0或它们首次添加目录时都会出现。而且,如果他们要改善这一点,则可以通过摆脱驱动器路径来实现,以实现更灵活或更像POSIX的功能。 (尽管UNC路径和cd /f/
“原始”路径已经可以说更灵活且更像POSIX,并且在NT中添加驱动器和目录系统时也没有摆脱它们)。 / p>
答案 1 :(得分:4)
文档提到了同一模块中另一个功能的这种行为。可以安全地假设它们将以相同的方式处理:
请注意,由于每个驱动器都有一个当前目录,因此
os.path.join("c:", "foo")
代表相对于驱动器C:
(c:foo
)而非c:\foo
上当前目录的路径。
https://docs.python.org/3/library/os.path.html
但是,the comment by abarnert是正确的。该行为是由Windows解释路径引起的。