使用远程 OS 分隔符的路径串联

Path Concatenation Using Remote OS Separator

我正在尝试将 pysftp 与外部 Linux 服务器一起使用,但是当我尝试使用 os.path.join()pathlib.Path() 连接路径和文件名时,它们可以理解默认为本地 (Windows) 路径分隔符 \'/'.join() 可以解决问题,但感觉不是正确答案,但可能是最佳解决方案。

import os
from pathlib import Path, PosixPath

os.path.join('path', 'to', 'file.txt')
# path\to\file.txt -- Windows

Path('path') / 'to' / 'file.txt'
# path\to\file.txt -- Windows

'/'.join(('path', 'to', 'file.txt'))
# path/to/file.txt -- Posix

通常情况下,我从 pysftp 的当前工作目录中获取 path/to,因此输入 path/to 而不是手动构建整个路径字符串,'/'.join() 方法是仍然是唯一有效的。

os.path.join('path/to', 'file.txt')
# path/to\file.txt -- Mixed

Path('path/to') / 'file.txt'
# path\to\file.txt -- Windows

'/'.join(('path/to', 'file.txt'))
# path/to/file.txt -- Posix

有没有办法强制 os.path.join()pathlib.Path 在我 Windows 上 运行 时使用 Posix 分隔符?我尝试设置 Pathsep 属性,但似乎必须为每个路径单独完成,即使它没有引发 AttributeError 并且它似乎没有想让我直接实例化 PosixPath class。

p = Path('path/to')
p.sep = '/'
# AttributeError: 'WindowsPath' object has no attribute 'sep'

PosixPath('path') / 'to' / 'file.txt'
# NotImplementedError: cannot instantiate 'PosixPath' on your system

尝试使用 os.name = 'posix'os.sep = '/' "trick" os 模块也不起作用

print(os.name)
# nt
print(os.path.join("path", "to", "file.txt"))
# path\to\file.txt -- Windows as expected
os.sep = '/'
print(os.path.join("path", "to", "file.txt"))
# path\to\file.txt -- Windows as expected

os.name = 'posix'
print(os.name)
# posix
print(os.path.join("path", "to", "file.txt"))
# path\to\file.txt -- still Windows.
os.sep = '/'
print(os.path.join("path", "to", "file.txt"))
# path\to\file.txt -- still Windows.

如果有关系,我是运行python3.7.0

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32

看起来 os 导入 ntpathposixpath,具体取决于它确定您的操作系统来自 os.name。不幸的是,我们知道如果不重新加载模块,重命名 os.nameos.sep 是行不通的,但是您可以直接导入两个路径模块:

>>> import posixpath
>>> import ntpath
>>> ntpath.join('asds','asdf', 'adf.txt')
'asds\asdf\adf.txt'
>>> posixpath.join('asdfa','asdf','asdf.txt')
'asdfa/asdf/asdf.txt'

或设置 os.path 如果你想使用 os

>>> import os
>>> os.path
<module 'posixpath' from '/home/usr/anaconda3/lib/python3.7/posixpath.py'>
>>> os.path = ntpath
>>> os.path
<module 'ntpath' from '/home/usr/anaconda3/lib/python3.7/ntpath.py'>
>>> os.path.join('asdfa','asd', 'asdf.txt')
'asdfa\asd\asdf.txt'
>>> os.path = posixpath
>>> os.path.join('asdfa','asd', 'asdf.txt')
'asdfa/asd/asdf.txt'

使用 os 的替代方法是在代码中使用正斜杠 / 作为路径分隔符。这是 cross-platform.

'path/to/somefile.txt'