【问题标题】:os.path.basename works with URLs, why?os.path.basename 适用于 URL,为什么?
【发布时间】:2010-11-09 21:33:07
【问题描述】:
>>> os.path.basename('http://example.com/file.txt')
'file.txt'

.. 我认为os.path.* 仅适用于本地路径而不适用于 URL?请注意,上面的示例也是在 Windows 上运行的......结果相似。

【问题讨论】:

  • 澄清:我不是在问/为什么/它有效(源代码显然是要走的路);而是我问为什么它应该工作(根据政策 - 特别是在 Windows '\' 是路径分隔符)
  • Microsoft 操作系统接受/ 正斜杠作为来自Dos 2 的路径分隔符,尽管从Dos 3 使用/ 被命令shell 禁用(它不再是),因为它是与命令行选项标志符号冲突。由于许多实现根本不知道/ 的有效性。 Python显然是。此外,您不能使用带有 "\\?\" 前缀的正斜杠。来源bytes.com/topic/python/answers/…msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#paths

标签: python url path


【解决方案1】:

在实践中,os.path 的许多函数只是字符串操作函数(只是 恰好 对路径操作特别方便)——因为这是无害的,偶尔也很方便,虽然正式地说“不正确",我怀疑这会很快改变——有关更多详细信息,请在 shell/命令提示符处使用以下简单的单行代码:

$ 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:])"

【讨论】:

  • 不得不说单行本很让人印象深刻。
  • @ars, tx," 确实更好,而且是跨平台的,所以我编辑了。@sunqiang,很高兴你喜欢它!-)
  • 嘿。无论如何,在我看来,在这种方式(通过传递 URL)中使用os.path.basename(或拆分,或诸如此类)是邪恶的......因为这不是记录在案的行为(并且将来可能会改变)。
  • @srid,是的——theurl.rsplit('/',1)[1] 绝对是一种更好、更安全的方法。
  • 不要忘记 URL 中的查询和锚部分。
【解决方案2】:

windows上看源码:C:\Python25\Lib\ntpath.py

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

os.path.split(在同一个文件中)只是拆分“\”(以及其他)

【讨论】:

  • 在 URL 上使用 os.path.basename 是从它们中提取此类信息的 Python 方式吗?还是应该改用urlpare.urparse('<myurl>').path
  • @naxa 对延迟响应感到抱歉,我不能说它是 pythonic,我认为它看起来也是 go 的 path/filepath.Base "support" url。我更喜欢 urlparse 作为 url 句柄。
【解决方案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'

【讨论】:

    【解决方案4】:

    使用来源卢克:

    
    def basename(p):
        """Returns the final component of a pathname"""
        i = p.rfind('/') + 1
        return p[i:]
    

    编辑(回应澄清):

    它偶然适用于 URL,就是这样。正因为如此,利用它的行为可能被某些人认为是代码异味。

    尝试“修复”它(检查传递的路径是否不是 url)也非常困难

    www.google.com/test.php
    me@other.place.com/12
    ./src/bin/doc/goto.c
    

    同时是正确的路径名和 URL(相对),http:/hello.txt 也是如此(一个 /,并且仅在 linux 上,这有点愚蠢:))。您可以为绝对网址“修复”它,但相对网址仍然有效。以不同的方式处理一个特殊情况在 python 世界中是一个很大的禁忌。

    总结一下:import this

    【讨论】:

    • “总结一下:导入这个”——这是什么意思?我看不到它的作用以及在问题的上下文中会实现什么
    【解决方案5】:

    正斜杠也是 Windows 中可接受的路径分隔符。

    只是命令行不接受以 / 开头的路径,因为该字符是为 args 开关保留的。

    【讨论】:

      【解决方案6】:

      为什么?因为它对于解析 URL 以及本地文件路径很有用。为什么不呢?

      【讨论】:

      • 因为它在 os.path 模块中,如果您正在运行 Windows,那不是操作系统所理解的路径;路径分隔符不同。我相信 / 是 Windows 中的有效文件名字符,这会使 URL 成为有效的 falename,并且这种行为不正确。我不是 Windows 用户,所以部分或全部评论可能是胡言乱语。
      • @SpoonMeiser,Microsoft 的 C 库实现实际上允许您使用 / 作为 \ 的有效替代品(操作系统本身,在系统调用/Win32API 级别上,在一定程度上做到了,但我认为它没有'从几年前开始;-)。
      • @Alex Martelli,如果这仍然是真的,那将是有道理的。
      猜你喜欢
      • 1970-01-01
      • 2021-05-03
      • 2013-08-12
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      相关资源
      最近更新 更多