我无法理解os.path.split
正在做什么。我正在调试一个程序(特别是git与Perforce的接口:git-p4)并且看到os.path.split
正在以脚本不期望的方式拆分传入路径,而且似乎也是如此与文档不一致。我做了一些更简单的测试,无法弄清楚它自己在做什么。
我要拆分的路径是//a/b
(路径实际上是Perforce路径,而不是本地文件系统路径),并且在返回的对的后半部分我需要b
。我在Windows上运行,并怀疑这个问题与看起来不像Windows的路径有关。当我尝试在一个在线沙箱中运行我的测试代码时,它的工作方式与我的Windows机器不同。
我已阅读文档:
将路径名路径拆分为一对(头部,尾部),其中tail是最后一个路径名组件,head是指向该路径的所有内容。尾部永远不会有斜线;如果path以斜线结尾,则tail将为空。如果路径中没有斜杠,则head将为空。如果path为空,则head和tail都为空。除非是根(仅限一个或多个斜杠),否则会从头部删除尾部斜杠。在所有情况下,join(head,tail)返回与path相同位置的路径(但字符串可能不同)。另请参见函数dirname()和basename()。
import os
print os.path.split("//a")
print os.path.split("//a/b")
print os.path.split("//a/b/c")
('//', 'a')
('//a', 'b')
('//a/b', 'c')
('//', 'a')
('//a', 'b')
('//a/b', 'c')
('//', 'a')
('//a/b', '')
('//a/b/', 'c')
Python 2,因为git-p4代码是为Python 2编写的。
所以我的第一个问题仅仅是为了我自己的理解。这里出了什么问题? OS差异?
然后超出我自己的好奇心,我需要一个修复。我已经能够修改git-p4,但我当然更喜欢尽可能少地编辑它,因为我没有尝试理解它!我不是蟒蛇专家。是否有类似的方法可以返回('//a', 'b')
?
答案 0 :(得分:4)
您使用错误的工具来处理这些路径。在Windows上,以//foo/bar
或\\foo\bar
开头的路径被视为UNC network paths,而os.path.split()
将首先使用os.path.splitdrive()
以确保UNC部分未被拆分。然后在拆分剩余部分后重新连接UNC或驱动部分。
您可以使用posixpath
模块来获取POSIX行为:
import posixpath
posixpath.split(yourpaths)
引用top of the os.path
module documentation:
注意:由于不同的操作系统具有不同的路径名约定,因此标准库中有多个此模块版本。
os.path
模块始终是适用于Python运行的操作系统的路径模块,因此可用于本地路径。但是,如果要操作始终采用不同格式之一的路径,也可以导入和使用单个模块。它们都有相同的界面:对于UNIX风格的路径,
posixpath
ntpath
用于Windows路径- [...]
在Windows上,os.path
与ntpath
是同一个模块,在线沙箱必须都是POSIX系统。
如果始终使用正斜杠作为路径分隔符,则将Perforce路径视为POSIX路径很好。