描述此 python windows os.chdir 行为的文档?
Documentation describing this python windows os.chdir behavior?
我今天了解到,在 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:\
我能理解为什么这种差异是有用的,但找不到任何记录这种行为的东西。我习惯于在我的目录中留下尾部斜杠,因为我通常在这里使用字符串...
是否在任何地方记录了此行为?我能指望它不变吗?
文档提到了同一模块中另一个函数的这种行为。假设它们将以相同的方式处理可能是安全的:
Note that since there is a current directory for each drive, os.path.join("c:", "foo")
represents a path relative to the current directory on drive C:
(c:foo
), not c:\foo
.
https://docs.python.org/3/library/os.path.html
然而,是正确的。该行为是由 Windows 解释路径的方式引起的。
这不是 Python 功能,它是一般 Windows 功能。
在 Windows 上,每个驱动器都会跟踪自己的当前工作目录。所以真的,"the current working directory" 是当前驱动器的当前工作目录。
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
的根。这样做的好处是使您的程序的本机 Windows 和 Cygwin 版本的工作非常相似,但缺点是使您的程序不像传统的 DOS 风格的程序那样工作。一般来说,更多的工具以 Python 的方式做事——它给你更多的灵活性,而且通常不那么混乱。
正如您在评论中添加的:
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 路径和 \.\…
"raw" 路径可以说已经更加灵活并且更像 POSIX,并且他们在添加时并没有摆脱 drive-and-dir 系统那些在北领地...)
我今天了解到,在 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:\
我能理解为什么这种差异是有用的,但找不到任何记录这种行为的东西。我习惯于在我的目录中留下尾部斜杠,因为我通常在这里使用字符串...
是否在任何地方记录了此行为?我能指望它不变吗?
文档提到了同一模块中另一个函数的这种行为。假设它们将以相同的方式处理可能是安全的:
Note that since there is a current directory for each drive,
os.path.join("c:", "foo")
represents a path relative to the current directory on driveC:
(c:foo
), notc:\foo
.
https://docs.python.org/3/library/os.path.html
然而,
这不是 Python 功能,它是一般 Windows 功能。
在 Windows 上,每个驱动器都会跟踪自己的当前工作目录。所以真的,"the current working directory" 是当前驱动器的当前工作目录。
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
的根。这样做的好处是使您的程序的本机 Windows 和 Cygwin 版本的工作非常相似,但缺点是使您的程序不像传统的 DOS 风格的程序那样工作。一般来说,更多的工具以 Python 的方式做事——它给你更多的灵活性,而且通常不那么混乱。
正如您在评论中添加的:
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 路径和 \.\…
"raw" 路径可以说已经更加灵活并且更像 POSIX,并且他们在添加时并没有摆脱 drive-and-dir 系统那些在北领地...)