Python 为什么驱动器号的绝对路径等于工作目录?
我在使用python的Python 为什么驱动器号的绝对路径等于工作目录?,python,path,relative-path,Python,Path,Relative Path,我在使用python的os.path模块时遇到了非常奇怪的行为。工作目录的驱动器号被视为工作目录本身的相对路径。例如: 使用os.path.abspath os.path.abspath('.')打印'C:\\Users\\myuser' os.path.abspath('C:')还打印'C:\\Users\\myuser' 使用os.path.join os.path.join('.','Users','myuser')给出预期的。\\Users\\myuser' 注意,“\\”插入到所有三个
os.path
模块时遇到了非常奇怪的行为。工作目录的驱动器号被视为工作目录本身的相对路径。例如:
使用os.path.abspath
os.path.abspath('.')
打印'C:\\Users\\myuser'
os.path.abspath('C:')
还打印'C:\\Users\\myuser'
使用os.path.join
os.path.join('.','Users','myuser')
给出预期的。\\Users\\myuser'
注意,“\\”
插入到所有三个条目之间。然而:
os.path.join('C:','Users','myuser')
给出了'C:Users\\myuser'
请注意,在C:
和用户之间插入'\\\'
的代码不多
使用os.path.abspath
和os.path.join
尽管缺少'\\'
,python还是接受'C:Users'
,并将其视为。\\Users'
,如下所示:
'os.path.abspath(os.path.join('C:','Users','myuser'))
给出'C:\\Users\\J34688\\Users\\myuser'
这和
'os.path.abspath(os.path.join('.','Users','myuser'))
给出'C:\\Users\\J34688\\Users\\myuser'
使用不同的驱动器号
使用其他驱动器时,不会出现此意外行为。例如:
os.path.abspath(os.path.join('D:','Users','myuser'))
'D:\\Users\\myuser'
这在我看来更合理
结论
这是怎么回事?为什么'C:'
被视为。\\'
附加说明
- 我找到了一个解决方法,通过使用
'C:\\'
强制执行预期行为,它将被视为实际的盘符。不过,在其他任何情况下,'\\'
都是可选的(例如,'.
相当于'.\\'
,'D:'
相当于'D:\'
)
- 无论您当前的工作目录是什么,此“功能”都有效。如果您将
cd
转到C:
驱动器中的另一个目录,则'C:'
将像'一样引用该新目录。
。此外,如果您换到另一个驱动器(例如,D:
),则'C:'
将按预期运行,新字母将采用此行为(例如,'D:'
现在相当于'。
)
Windows API中的os.path.abspath调用。该文件规定:
如果指定“U:,则返回的路径是“U:”驱动器上的当前目录
这只是Windows处理路径的方式,与Python无关
文件也适用于各国
请注意,因为每个驱动器都有一个当前目录,所以os.path.join(“c:,“foo”)表示相对于驱动器c:(c:foo)上当前目录的路径,而不是c:\foo
os.path.abspath
在Windows API中调用。该文件规定:
如果指定“U:,则返回的路径是“U:”驱动器上的当前目录
这只是Windows处理路径的方式,与Python无关
文件也适用于各国
请注意,因为每个驱动器都有一个当前目录,所以os.path.join(“c:,“foo”)表示相对于驱动器c:(c:foo)上当前目录的路径,而不是c:\foo
我想这就是Windows处理相对路径名的方式,我不认为这是Python特有的。试试pathlib
。有一些特定于平台的Path
对象可以操作路径。@Barmar By golly你说得对。。。在cmd提示符中使用“cd C:Documents”与“cd\\Documents”相同。MS从未停止让我惊讶…尽管如此。。。为什么os.path.join不像在其他情况下那样包含“\\”?os.path.join()
如果给它相对路径,它不会返回绝对路径。我想这就是Windows处理相对路径名的方式,我不认为这是Python特有的。试试pathlib
。有一些特定于平台的Path
对象可以操作路径。@Barmar By golly你说得对。。。在cmd提示符中使用“cd C:Documents”与“cd\\Documents”相同。MS从未停止让我惊讶…尽管如此。。。为什么os.path.join不像在其他情况下那样包含“\\”?os.path.join()
如果给它相对路径,它不会返回绝对路径。谢谢!对GetFullPathName
的API调用很有意义。我从来不知道Windows将C:Path
视为\\Path
。不过,我必须承认,os.path.join
文档对我来说太过分了,但我相信比我聪明的人有很好的理由实现它!我认为这是可以接受的。在像Python这样的跨平台系统中,在做特定操作系统的用户可能期望的事情(例如,您在这里看到的行为)和做一些不同的事情(例如,将其视为“C:\whatever”)之间可以有一条很好的界限。由于驱动器号的行为必须是特定于Windows的,因此他们可能认为遵循底层平台提供的行为是有意义的,而不是试图修改它,这可能会变得非常复杂。谢谢!对GetFullPathName
的API调用很有意义。我从来不知道Windows将C:Path
视为\\Path
。不过,我必须承认,os.path.join
文档对我来说太过分了,但我相信比我聪明的人有很好的理由实现它!我认为这是可以接受的。在像Python这样的跨平台系统中,在做特定操作系统的用户可能期望的事情(例如,你在这里看到的行为)和做一些不同的事情之间,可以有一条很好的界限