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

时间:2012-08-23 06:50:35

标签: python path

众所周知,Windows接受"\""/"作为分隔符。 但是在python中,使用了"\"。例如,将返回致电os.path.join("foo","bar")'foo\\bar'。令人讨厌的是有一个转义字符,所以你不能只复制路径字符串并粘贴到资源管理器位置栏。

我想知道有没有办法让python使用"/"作为默认分隔符,我尝试将os.path.sep和os.sep的值更改为"/",但是{{1仍然使用os.path.join

什么是正确的方式?

PS:

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

5 个答案:

答案 0 :(得分:6)

所有关于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了解{{1} }作为路径分隔符。

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

答案 1 :(得分:5)

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

所以而不是:

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'

答案 2 :(得分:1)

为什么不定义自定义显示功能?

e.g。

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。

然后,您可以在utils文件的顶部放置if语句,并将display_pathjoin分别定义为no-op和os.path.join,如果不是视窗。

答案 3 :(得分:1)

我不建议这样做。

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

使用cd将其视为相对路径,例如:

命令行:

  

C:\用户\ YourUser> cd / FooBar
  C:\ FooBar的

此处,/替换了驱动器号。


另外,我没有看到复制字符串的问题,因为如果你print字符串,字符串会按你的意愿显示:

Python解释器:

  

>>> import os
  >>> print os.path.join(“c:\”,“foo”,“bar”)
  C:\富\酒吧
  >>>


答案 4 :(得分:0)

我没有足够的声誉来评论,但above answer不正确。

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

以下是一个例子:

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>