【问题标题】:Differences between use of os.path.join and os.sep concatenation使用 os.path.join 和 os.sep 连接的区别
【发布时间】:2013-05-23 06:52:29
【问题描述】:

我正在尝试弄清楚它是否更好用:

os.path.join(str1, str2)

或:

str1 + os.sep + str2

使用timeit 进行分析我发现,正如预期的那样,连接速度更快:

%timeit 'playground' + os.sep + 'Text'
10000000 loops, best of 3: 139 ns per loop

%timeit os.path.join('playground', 'Text')
1000000 loops, best of 3: 830 ns per loop

所以我的问题是,由于串联也更短,有没有理由使用os.path.join(()

谢谢

【问题讨论】:

    标签: python string path operating-system


    【解决方案1】:

    就在文档中:

    os.path.join(path1[, path2[, ...]])

    智能加入一个或多个路径组件。如果任何组件是绝对路径,则所有先前的组件(在 Windows 上,包括先前的驱动器号,如果有的话)都将被丢弃,并继续加入。返回值是path1 和可选的path2 等的串联,除了最后一个以外的每个非空部分之后只有一个目录分隔符(os.sep)。 (这意味着空的最后一部分将导致路径以分隔符结尾。)请注意,在 Windows 上,由于每个驱动器都有一个当前目录,os.path.join("c:", "foo") 表示相对于驱动器 @987654326 上的当前目录的路径@ (c:foo),而不是 c:\foo

    os.path.join 做得更多:

    >>> os.path.join("/home/", "/home/foo")
    '/home/foo'
    >>> "/home/" + os.sep + "/home/foo"
    '/home///home/foo'
    

    你永远不会遇到os.path.join 是你程序的瓶颈的情况,所以使用它,它也更具可读性。

    【讨论】:

    • 我不建议使用它,当您知道时,您不需要它。 os.path.join 的结果不太可预测,并且绝对没有引入开销不是“过早的优化”,而只是糟糕的编码风格。这不是瓶颈,而是这些决定的累积是现代计算机变慢的原因。例如,如果您有一个从os.path.realpath 获得的路径和一个您知道其中不包含斜杠的文件名,那么os.sep.join 是更好的选择,因为在大多数情况下都是如此。
    【解决方案2】:

    os.path.join 接受多个参数:

    import os
    os.path.join('a', 'b', 'c')
    

    由于许多路径部分的连接,这将变得相当长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2016-04-07
      • 2017-01-05
      • 2020-10-23
      相关资源
      最近更新 更多