os.path.basename为什么也能处理URL?

14 投票
6 回答
21959 浏览
提问于 2025-04-15 12:49
>>> os.path.basename('http://example.com/file.txt')
'file.txt'

.. 我原以为 os.path.* 只适用于本地路径,而不适用于网址?请注意,上面的例子在Windows上运行时也得到了类似的结果。

6 个回答

3

注意那些带有参数、锚点或者其他不是“普通”网址的链接:

>>> import os.path
>>> os.path.basename("protocol://fully.qualifie.host/path/to/file.txt")
'file.txt'
>>> os.path.basename("protocol://fully.qualifie.host/path/to/file.txt?param1&param1#anchor")
'file.txt?param1&param1#anchor'
3

在Windows系统上,可以查看源代码:C:\Python25\Lib\ntpath.py

def basename(p):
    """Returns the final component of a pathname"""
    return split(p)[1]

os.path.split(在同一个文件里)只是把“\”符号(还有其他一些东西)分开。

19

实际上,很多os.path里的函数其实就是处理字符串的函数(恰好特别适合用来处理路径)——虽然从严格意义上来说这样做是“错误”的,但因为这没什么坏处,有时候还挺方便的,所以我觉得这种情况短期内不会改变。如果想了解更多细节,可以在命令行里用下面这个简单的一行代码:

$ python -c"import sys; import StringIO; x = StringIO.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print x.getvalue().splitlines()[10][9:]"

或者,如果你用的是Python 3的话:

$ python -c"import sys; import io; x = io.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print(x.getvalue().splitlines()[10][9:])"

撰写回答