为什么要使用 os.path.join 而不是字符串串联?

Why use os.path.join over string concatenation?

提问人:user1905410 提问时间:12/19/2012 最后编辑:cs95user1905410 更新时间:10/26/2017 访问量:28219

问:

我认为,我无法在这里看到更大的图景;但基本上我不知道你为什么要使用而不是普通的字符串串联?os.path.join

我主要使用 VBScript,所以我不明白这个函数的意义。

python 文件路径

评论

0赞 danicotra 5/16/2020
另外,为什么你现在可能想使用 pathlib 而不是 os.path

答:

5赞 jassinm 12/19/2012 #1

可以在带有“\”的 Windows 和带有“/”的 Unix(包括 Mac OS X)上运行。

对于 posixpath,这是简单的代码

In [22]: os.path.join??
Type:       function
String Form:<function join at 0x107c28ed8>
File:       /usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py
Definition: os.path.join(a, *p)
Source:
def join(a, *p):
    """Join two or more pathname components, inserting '/' as needed.
    If any component is an absolute path, all previous path components
    will be discarded."""
    path = a
    for b in p:
        if b.startswith('/'):
            path = b
        elif path == '' or path.endswith('/'):
            path +=  b
        else:
            path += '/' + b
    return path

没有窗口,但“\”也应该有

评论

7赞 Eric O. Lebigot 12/19/2012
然而,奇怪的是,在 Windows 上使用作品,使用 CPython....../
1赞 Blair 12/19/2012
这。当有一个功能可以为您设计时,您为什么要尝试自己处理路径分隔符等?
1赞 user1905410 12/19/2012
我阅读了评论,它将路径连接在一起,我只是不明白为什么我会使用它,很抱歉,就像我说的那样,我显然没有看到更大的图景。
0赞 12/19/2012
@user1905410 正如 Fine Documentation 所涵盖的那样,它的作用远不止于此。
0赞 12/19/2012
@user1905410 正如《精细文档》所涵盖的那样,它的作用远不止于此。
-2赞 bkaiser 12/19/2012 #2

它与操作系统无关。如果将路径硬编码为 C:\Anything,它们将只能在 Windows 上运行。如果你用 Unix 标准“/”对它们进行硬编码,它们只能在 Unix 上运行。os.path.join 检测运行它的操作系统,并使用正确的符号联接路径。

评论

13赞 Léo Germond 7/2/2016
If you hardcode them with the Unix standard "/" they will only work on Unix.这是错误的。“/”在 Windows 和 linux/unix/bsd/darwin 上运行良好。
116赞 user1902824 12/19/2012 #3

便携式

编写一次文件路径操作,它可以在许多不同的平台上免费运行。分隔字符被抽象掉,使您的工作更轻松。

聪明

您不再需要担心该目录路径是否有尾部斜杠。 如果需要,将添加它。os.path.join

清楚

使用可以使阅读您的代码的其他人清楚地知道您正在使用文件路径。人们可以快速浏览代码,发现它本质上是一个文件路径。如果你决定自己构建它,你可能会分散读者的注意力,使他们无法发现你的代码的实际问题:“嗯,一些字符串连接,一个替换。这是文件路径还是什么?嘎!他为什么不用? :)os.path.joinos.path.join

评论

4赞 Léo Germond 7/2/2016
谢谢。Smart 和 Clear 部分正是我在向自己提出同样问题时所寻找的那种推理:可移植部分很容易通过与“/”而不是仅限 Windows 的“\”连接来实现,因此它有点没意义。
7赞 hraban 5/3/2017
第 3 点有道理,但第 1 点和第 2 点没有实际意义。/ 适用于 Windows。您曾经使用过什么不支持它的操作系统?OS/FS 会为您规范化双尾斜杠。我并不是说不要使用 ,但如果你这样做,请出于正确的理由去做。os.path.join 周围有很多 cargo-culting。正如他们所说,“愚蠢的一致性是小头脑的妖精”。os.path.join
1赞 haneulkim 5/13/2021
在计算速度方面呢?
2赞 John Henckel 3/2/2022
如果只是将路径联接到文件,则应使用 .这是可读的,并且可移植到所有操作系统。 使用是危险的,因为它不一致。例如,将在某些系统和其他系统上返回。path + '/' + fileos.path.joinos.path.join('/foo/bar','test')/foo/bar/test/foo/bar\\test
2赞 ketil 3/24/2023
然而,它们并不完全等同。考虑 ,它实际上返回 。因此,如果要混合这些方法,或者从字符串连接转换为 ,请确保路径组件不会意外地具有前导斜杠。os.path.join('a', '/b')/bos.path.join