我今天了解到,在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:\
我可以理解为什么这种差异是有用的,但我找不到任何记录这种行为的东西。我已经习惯了在我的目录中留下尾随的斜杠,就像我通常使用的这里的字符串一样…
这种行为是否有记录在案?我可以相信它不会改变吗?
发布于 2018-07-20 07:15:38
文档在同一模块中的另一个函数中提到了此行为。可以安全地假设它们将以相同的方式处理:
请注意,由于每个驱动器都有一个当前目录,因此
os.path.join("c:", "foo")
表示相对于驱动器C:
(c:foo
)上当前目录的路径,而不是c:\foo
。
https://docs.python.org/3/library/os.path.html
然而,the comment by abarnert是正确的。此行为由Windows解释路径的方式引起。
发布于 2018-07-20 07:18:57
这不是一个Python特性,它是一个通用的Windows特性。
在Windows上,每个驱动器都跟踪自己的当前工作目录。因此,“当前工作目录”实际上是当前驱动器的当前工作目录。
chdir('F:')
将驱动器更改为F
,但不更改F的工作目录,因此您最终更改为F
drive.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
的根目录。这具有使您的程序的本机Windows和Cygwin构建工作非常相似的优点,但缺点是使您的程序不像传统的DOS样式的程序那样工作。一般来说,更多的工具会像Python那样做事情--它给了你更多的灵活性,而且通常不会那么令人困惑。
正如您在评论中添加的:
除了“我可以依靠它不改变吗”,我的意思是谁能说出微软将在他们新宣布的“改进”的控制台中打破什么。
嗯,这个行为可以追溯到…我认为PC-DOS2.0,或者当他们第一次添加目录的时候。如果他们想要改进这一点,他们可能会通过去掉驱动器和路径来实现,或者更灵活,或者更像POSIX。(尽管UNC路径和\\.\…
“原始”路径已经被证明是更灵活和更像POSIX的路径,而且当它们在NT…中添加这些路径时,它们并没有摆脱驱动器和目录系统)
https://stackoverflow.com/questions/51432825
复制相似问题