为什么不使用os.path.sep或os.sep而使用os.path.join?

6
我们知道,在Windows中,"\""/" 都被认为是路径分隔符。但在Python中,使用的是 "\"。例如,调用 os.path.join("foo","bar"),将返回 'foo\\bar'。令人烦恼的是,存在转义字符,因此无法直接复制路径字符串并粘贴到资源管理器地址栏中。
我想知道有没有办法让Python使用 "/" 作为默认分隔符,我已经尝试将 os.path.sep 和 os.sep 的值更改为 "/",但 os.path.join 仍然使用 "\\"
请问正确的方式是什么?
附注:
我不明白为什么Python在Windows上使用 "\" 作为默认分隔符,也许旧版本的Windows不支持 "/"?

3
os.path.sep应该用于连接文件名和目录名...谁说os.path.sep必须用于URL? - user2665694
1
如果您不关心正确的路径分隔符,为什么要使用os.path.join呢? - sloth
@cdarke 这是一个解决方案,但我认为如果我可以为特定系统选择自己的分隔符,那可能会更优雅一些? - ThemeZ
@BigYellowCactus 我不确定,你能告诉我所有可以运行Python的系统和它们的分隔符吗? - ThemeZ
@ThemeZ 我认为唯一使用反斜杠的系统是塞班操作系统。顺便说一下,我完全没有问题,因为你可以直接调用 print 函数,多余的反斜杠就会被去掉。请看我的回答。 - sloth
显示剩余4条评论
5个回答

13

简单回答你的问题,只需使用posixpath而不是os.path。

所以,用posixpath替换:

from os.path import join
join('foo', 'bar')
# will give you either 'foo/bar' or 'foo\\bar' depending on your OS

用法:

from posixpath import join
join('foo', 'bar')
# will always give you 'foo/bar'

7

这篇文章将介绍Python如何检测您的操作系统:

# in os.py
if 'posix' in _names:
    ...
    import posixpath as path   

elif 'nt' in _names:
    ...
    import ntpath as path

因此,在Windows上加载了ntpath模块。如果您查看ntpath.pyposixpath.py模块,您会注意到ntpath.join()更为复杂,这也是您提到的原因:Windows将/作为路径分隔符。

底线:尽管您可以在Windows中使用posixpath.join()(只要参数处于POSIX格式),但我不建议这样做。


2
为什么不定义一个自定义的显示函数?
例如:
def display_path(path):
    return path.replace("\\", "/")

如果你想用str.join替换os.path.join,只需要这样做(str.join期望一个单一的列表,os.path.join期望*args):

join = lambda *args: "/".join(args)

也许更好的方法是让Python对所有内容进行标准化,然后进行替换,例如:
join = lambda *args: os.path.join(*args).replace("\\", "/")

上述方法可能在posix系统中存在一个问题,即文件路径中含有空格。
如果不是Windows系统,则可以在utils文件的顶部放置一个if语句,并将display_path和join分别定义为no-op和os.path.join。

1

我不建议这样做。

请注意,虽然Windows也接受斜杠/作为路径分隔符,但在某些情况下它具有不同的含义。

例如,在使用cd命令时,它被视为相对路径:

命令行:

c:\Users\YourUser> cd /FooBar
c:\FooBar

在这里,/代替了驱动器号。


此外,我认为复制字符串没有任何问题,因为如果您print字符串,则可以按照您的意愿显示字符串:

Python解释器:

>>> import os
>>> print os.path.join("c:\", "foo","bar")
c:\foo\bar
>>>



“/” 在 Linux 上也是根目录,所以这不是问题。你说得对,打印的时候没问题,但调试的时候让我很烦恼。 - ThemeZ
那么这个问题具体是在什么时候和地点出现的呢?你使用哪个集成开发环境(IDE)? - sloth
我的意思是,在调试时,反斜杠在变量监视器中显示为“\”,而且有太多的路径我不想全部打印出来。 - ThemeZ
@ThemeZ 是的,但你用哪个IDE呢?Eclipse?Wing?IDLE? - sloth

0

我没有足够的声望来评论,但是上面的答案是不正确的。

Windows有一个工作目录和工作驱动器的概念。在你的当前工作驱动器上,/被视为绝对路径,因为Windows没有单个根的概念。在上面的例子中,cd /FooBar转到C:\foobar,因为工作驱动器是C:,而不是因为C:是“根”驱动器或某种特殊的驱动器。

这里是一个例子:

C:\Users\user> cd /
C:\> d:
D:\> cd /Users
The system cannot find the path specified.
D:\> mkdir test
D:\> cd test
D:\test> cd c:/Users
D:\test> cd /
D:\> cd test
D:\test> c:
C:\Users\> d:
D:\test> 

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