os.path.basename()不一致,我不确定为什么

时间:2019-03-06 06:19:33

标签: python python-3.x windows

在创建一个备份文件的程序时,我发现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', ' ')

我不知道该如何解决。最奇怪的事情是我早些时候跑过同一行,并且行得通,但现在不再行了!它与网络驱动器上的共享文件夹的第一部分有关吗?

1 个答案:

答案 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)