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

117

我觉得我无法看到更大的画面;但基本上我不知道为什么你要使用os.path.join而不是普通字符串连接?

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


3个回答

116

便携

只需编写一次文件路径操作代码,即可在多个不同平台上免费使用。定界字符已被抽象化,使您的工作更加轻松。

智能

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

清晰

使用os.path.join可以让其他人阅读您的代码时更容易发现您正在处理的是文件路径。人们可以快速扫描代码并发现其内在特性是文件路径。如果您决定自己构造路径,则可能会分散读者的注意力而无法找到实际的问题:“嗯,一些字符串连接和替换。这是文件路径还是什么?糟糕!为什么他没有使用os.path.join?” :)


4
谢谢。"Smart"和"Clear"的部分正是我在自问同样的问题时所寻求的推理类型:将可移植性转换为使用"/"连接而不是仅适用于Windows的""符号,因此这有点没有实际意义。 - Léo Germond
7
第三点有价值,但第一和第二点是无意义的。/ 可在 Windows 上使用。您使用的操作系统不支持它吗?双斜杠在操作系统/文件系统中被标准化。我不是说不要使用 os.path.join,但如果您使用,请出于正确的原因使用它。围绕 os.path.join 存在很多盲目模仿。正如人们所说,“愚蠢的一致性是小心灵的妖怪”。 - hraban
1
从计算速度方面来说呢? - haneulkim
2
如果你只是要将路径和文件连接起来,应该使用 path + '/' + file。这种方法易于阅读,并且在所有操作系统上都可以使用。使用 os.path.join 是有风险的,因为它不一致。例如,os.path.join('/foo/bar','test') 在某些系统上会返回 /foo/bar/test,而在其他系统上会返回 /foo/bar\\test - John Henckel
2
然而,它们并不完全等效。考虑 os.path.join('a', '/b'),它实际上返回 /b。因此,如果您混合使用这些方法,或者从字符串连接转换为 os.path.join,请确保路径组件没有意外地具有前导斜杠。 - ketil
显示剩余4条评论

5

该代码可在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

没有Windows,但是在'\ '上应该有相同的内容。


7
有趣的是,在 Windows 平台上,使用 / 在 CPython 中可以正常工作。 - Eric O. Lebigot
1
为什么要自己处理路径分隔符等问题,当有一个专门设计用来解决这个问题的函数呢? - Blair
1
我阅读了评论并了解到它可以将路径连接在一起,但我无法理解为什么我会使用它,抱歉,正如我所说,我显然没有看到更大的画面。 - user1905410
@user1905410 它做的不仅仅是那些,正如Fine文档所涵盖的那样。 - user166390
@user1905410 它做的不仅仅是那些,正如精美的文档所涵盖的那样。 - user166390
@user1905410:不是的,但是文档会给你更多的理由。有很多用例,但人们经常使用它来以不太复杂的方式处理路径拼接,并允许您在相对路径(例如os.path.join('/home', 'tadeck'))和绝对路径(例如os.path.join('/home', '/usr'))之间使用相同的代码。 - Tadeck

-2

它是独立于操作系统的。如果你硬编码路径为C:\Whatever,那么它们只会在Windows上工作。如果你用Unix标准的“/”硬编码它们,那么它们只会在Unix上工作。os.path.join可以检测运行的操作系统,并使用正确的符号连接路径。


13
如果您在编码时使用Unix标准的“/”,则它们只能在Unix上工作,这是错误的。在Windows和Linux / Unix / BSD / Darwin上,“/”都可以正常工作。 - Léo Germond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接