我今天了解到,在 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:\
我能理解为什么这种差异是有用的,但找不到任何记录这种行为的东西。我习惯于在我的目录中留下尾部斜线,因为我通常在这里使用字符串...
是否在任何地方记录了这种行为?我能相信它不会改变吗?
最佳答案
这不是 Python 的特性,它是一般的 Windows 特性。
在 Windows 上,每个驱动器都会跟踪其自己的当前工作目录。所以实际上,“当前工作目录”是当前驱动器的当前工作目录。
chdir('F:')
将驱动器更改为F
,但不更改 F 的工作目录,因此您最终更改为当前F
驱动器的目录。chdir('F:\\')
将驱动器更改为F
,并将F
的工作目录更改为它的根目录,所以你最终会切换到F
驱动器的根目录。
它也不特定于 chdir
。任何处理路径名的函数,甚至 open
,都会以这种方式运行。
*open('F:spam.txt')
打开 F 驱动器当前工作目录中的文件 spam.txt
(即使您当前的驱动器是, C)。 (这与 DOS 风格工具的工作方式一致。)
*open('F:\\spam.txt')
打开 F 盘根目录下的文件 spam.txt
。
一些跨平台工具试图假装驱动器是顶级挂载点,所以 cd F:
就像 cd/f/
,并且 确实 转到F
的根目录。这样做的好处是使您的程序的 native Windows 和 Cygwin 构建非常相似,但缺点是使您的程序不像传统的 DOS 风格的程序那样工作。一般而言,更多工具以 Python 的方式做事——它为您提供了更大的灵 active ,并且通常不会造成混淆。
正如您在评论中添加的那样:
Apart from the "Can I rely on it not changing", I mean who can tell what Microsoft will break in their newly announced 'improved' console.
好吧,这种行为可以追溯到……我认为是 PC-DOS 2.0,或者当他们第一次添加目录时。如果他们要改进这一点,他们可能会通过摆脱驱动器和路径来实现更灵活或更像 POSIX 的东西。 (虽然 UNC 路径和 \\.\…
“原始”路径可以说已经更灵活,更像 POSIX,并且当它们添加了 NT 中的那些……)
关于python - 描述此 python windows os.chdir 行为的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51432825/