【问题标题】:os.path.basename() is inconsistent and I'm not sure whyos.path.basename() 不一致,我不知道为什么
【发布时间】:2019-03-06 06:19:32
【问题描述】:

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

我不知道如何绕过它.. 最奇怪的是我之前跑过同一条线路并且它有效,但它不再适用了!是否与第一部分是网络驱动器上的共享文件夹有关?

【问题讨论】:

  • 欢迎来到 StackOverflow!请添加有关操作系统的信息:是 Windows 吗?
  • 是的,它是 Windows。
  • 看看pathlib

标签: python python-3.x windows


【解决方案1】:

这看起来像 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),但它指出:

返回路径名路径的基本名称。这是通过将路径传递给函数 split() 返回的对的第二个元素。 请注意,此函数的结果与 Unix basename 程序不同

最后强调的部分至少是真的! (os.path.split() 的文档没有提到这个问题,甚至没有谈到 windows)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多