众所周知,Windows接受"\"
和"/"
作为分隔符。
但是在python中,使用了"\"
。例如,将返回致电os.path.join("foo","bar")
,'foo\\bar'
。令人讨厌的是有一个转义字符,所以你不能只复制路径字符串并粘贴到资源管理器位置栏。
我想知道有没有办法让python使用"/"
作为默认分隔符,我尝试将os.path.sep和os.sep的值更改为"/"
,但是{{1仍然使用os.path.join
。
什么是正确的方式?
PS:
我只是不明白为什么python在windows上使用“\”作为默认分隔符,也许旧版本的windows不支持“/”?
答案 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.py
和posixpath.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_path
和join
分别定义为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>