在Python中,如何在os.path.join()函数中指定目录分隔符?

8

我尝试了下面的代码,试图将目录分隔符更改为正斜杠/,但仍然卡在反斜杠\上。文档说该函数使用目录分隔符os.sep连接路径,但在我的情况下这并没有起作用。

import os
os.sep = '/'
print(os.sep)
print(os.path.join('.', 'path'))

1
也许你应该使用 '/'.join(['.', 'path']) ?对于大多数情况(但不是全部,所以要小心),你将得到与你期望的分隔符相同的输出。 - jedwards
你为什么想这样做?反斜杠对于你的操作系统真的有问题吗? - Stefan Pochmann
5个回答

9
我认为这里回答了为什么Python使用特定的分隔符。
话虽如此,你可以使用Pathlib模块来构建你的路径,并指定你想要 Posix 还是 Windows 路径。
例如:
from pathlib import PurePosixPath, PureWindowsPath

print(PurePosixPath('some', 'silly', 'long', 'path'))
>> some/silly/long/path

print(PureWindowsPath('some', 'silly', 'long', 'path'))
>> some\silly\long\path

请务必使用pure版本的PosixPathWindowsPath。如果您试图在Posix系统上使用WindowsPath,则会出现以下错误:

NotImplementedError: cannot instantiate 'WindowsPath' on your system

这也在文档中有明确说明:

如果你想在Unix机器上(或者反过来)操作Windows路径。在Unix上运行时,无法实例化WindowsPath,但可以实例化PureWindowsPath


2
使用pathlib,您可以在构建的Path上调用.as_posix(),以获得其字符串表示形式,其中正斜杠作为分隔符。
示例:
>>> from pathlib import Path
>>> Path('dirA', 'dirB', 'file.txt').as_posix()
'dirA/dirB/file.txt'

>>> from pathlib import PureWindowsPath
>>> PureWindowsPath('dirA\\dirB', 'file.txt').as_posix()
'dirA/dirB/file.txt'

1

您可以查看不同操作系统的源代码。例如,Mac版本为:

def join(s, *p):
    path = s 
    for t in p:
        if (not s) or isabs(t):
            path = t 
            continue
        if t[:1] == ':':
            t = t[1:]
        if ':' not in path:
            path = ':' + path
        if path[-1:] != ':':
            path = path + ':' 
        path = path + t 
    return path

你可以看到它直接放在函数中,不依赖于os.sep。每个Python安装都包括每个操作系统的os.path函数。它们在Python目录下的macpath.pyntpath.pyposixpath.py中可用。如果你查看每一个模块,你会注意到posixpath模块有你想要的内容:
import posixpath

print(posixpath.join('.', 'path'))

0

你可以用自己的函数替换 os.path 中的函数:

import os
path = "public\\INSTALL\\"
print("Initial unmodified join return: '%s'" % os.path.join('.', path) )
native_os_path_join = os.path.join
def modified_join(*args, **kwargs):
    return native_os_path_join(*args, **kwargs).replace('\\', '/')
os.path.join = modified_join
print("Modified join return: '%s'" % os.path.join('.', path) )

输出:

Initial unmodified join return: '.\public\INSTALL\'
Modified join return: './public/INSTALL/'

0
总之,如果由于某种原因os.path.join()无法正常工作,我们可以简单地执行以下操作。
   os.sep.join([path,name])

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