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

The*_*meZ 3 python path

我们知道,windows接受这两个"\""/"作为分隔符.但在python中,"\"使用.例如,呼叫os.path.join("foo","bar"),'foo\\bar'将被退回.令人讨厌的是,有一个转义字符,因此您不能只复制路径字符串并粘贴到资源管理器位置栏.

我想知道是否有任何方法可以将python "/"用作默认分隔符,我已经尝试将os.path.sep和os.sep的值更改为"/",但os.path.join仍然使用"\\".

什么是正确的方法?

PS:

我只是不明白为什么python在windows上使用"\"作为默认分隔符,也许旧版本的windows不支持"/"?

Zau*_*bov 6

这就是Python如何检测你的操作系统:

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

elif 'nt' in _names:
    ...
    import ntpath as path
Run Code Online (Sandbox Code Playgroud)

因此,在Windows ntpath上加载模块.如果你检查ntpath.pyposixpath.py模块,你会发现ntpath.join()它有点复杂,这也是因为你提到的原因:Windows理解/为路径分隔符.

底线:虽然你可以posixpath.join()在Windows中使用(只要参数是POSIX格式的),我不建议这样做.


sem*_*lon 6

要尽可能简单地回答您的问题,只需使用posixpath而不是os.path.

所以代替:

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

使用:

from posixpath import join
join('foo', 'bar')
# will always give you 'foo/bar'
Run Code Online (Sandbox Code Playgroud)


Jef*_*ner 2

为什么不定义一个自定义的显示函数呢?

例如

def display_path(path):
    return path.replace("\\", "/")
Run Code Online (Sandbox Code Playgroud)

如果你想替换str.joinos.path.join你可以这样做(str.join需要一个列表,os.path.join需要*args):

join = lambda *args: "/".join(args)
Run Code Online (Sandbox Code Playgroud)

也许更好的办法是让 Python 标准化所有内容,然后替换,例如:

join = lambda *args: os.path.join(*args).replace("\\", "/")
Run Code Online (Sandbox Code Playgroud)

上面的唯一问题可能是在 posix 上,当文件路径中有空格时。

if然后,您可以在 utils 文件的顶部放置一条语句,并将display_pathjoin分别定义为无操作和 os.path.join(如果不在 Windows 上)。