在创建一个备份文件的程序时,我发现os.path.basename()不能始终如一地工作。例如:
import os
folder = '\\\\server\\studies\\backup\\backup_files'
os.path.basename(folder)
返回'backup_files'
folder = '\\\\server\\studies'
os.path.basename(folder)
返回''
我希望第二个basename函数返回'studies',但它返回一个空字符串。我跑了os.path.split(folder)
来看看它是如何分割字符串的,事实证明,它正在考虑将整个路径作为目录,即('\\\\server\\studies', ' ')
。
我不知道该如何解决。最奇怪的事情是我早些时候跑过同一行,并且行得通,但现在不再行了!它与网络驱动器上的共享文件夹的第一部分有关吗?
答案 0 :(得分:3)
看起来像Windows UNC的
UNC路径可以被视为与unix路径等效,只是在开始处有两个反斜杠。
一种解决方法是使用经典的rsplit
:
>>> r"\\server\studies".rsplit(os.sep,1)[-1]
'studies'
有趣的事实:3条路径可以正常工作:
>>> os.path.basename(r"\\a\b\c")
'c'
现在为什么呢?让我们在Windows上检查ntpath
的源代码:
def basename(p):
"""Returns the final component of a pathname"""
return split(p)[1]
现在可以split
def split(p):
seps = _get_bothseps(p)
d, p = splitdrive(p)
现在splitdrive
def splitdrive(p):
"""Split a pathname into drive/UNC sharepoint and relative path specifiers.
Returns a 2-tuple (drive_or_unc, path); either part may be empty.
仅阅读文档即可使我们了解发生了什么。
Windows共享点必须包含2个路径部分:
\\server\shareroot
因此\\server\studies
被视为驱动器,并且路径为空。路径中有3个部分时不会发生。
请注意,这不是错误,因为不可能像普通目录一样使用\\server
,也不能在下面创建目录等。
请注意,os.path.basename
的官方文档没有提及(因为os.path
在后台调用了ntpath
),但声明:
返回路径名path的基本名称。这是将路径传递给函数split()返回的对中的第二个元素。 请注意,此函数的结果与Unix基本名称程序不同
最后强调的那部分至少是正确的! (并且os.path.split()
的文档中没有提到该问题,甚至没有谈论Windows)