4

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

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

什么是正确的方法?

PS:

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

4

5 回答 5

10

要尽可能简单地回答您的问题,只需使用 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'
于 2014-06-06T01:53:00.030 回答
7

这完全是关于 Python 如何检测你的操作系统:

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

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

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

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

于 2012-08-23T06:56:03.750 回答
2

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

例如

def display_path(path):
    return path.replace("\\", "/")

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

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

也许更好的是让 Python 规范化所有内容,然后替换,例如:

join = lambda *args: os.path.join(*args).replace("\\", "/")

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

if然后,您可以在 utils 文件的顶部放置一条语句,如果不在 Windows 上,则分别将 and 定义为 no-op 和 os.path.join display_pathjoin

于 2012-08-23T06:58:08.803 回答
1

我不建议这样做。

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

它被视为使用相对路径cd,例如:

命令行:

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

在这里,/替换驱动器号。


另外,我根本看不出复制字符串有问题,因为如果你print是字符串,那么字符串会按照你的意愿显示:

Python解释器:

>>> 导入操作系统
>>> 打印 os.path.join("c:\", "foo","bar")
c:\foo\bar
>>>


于 2012-08-23T07:17:23.147 回答
0

我没有足够的声誉发表评论,但上述答案不正确。

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

这是一个例子:

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> 
于 2018-04-17T17:19:02.597 回答