使用远程操作系统分隔符进行路径串联

时间:2019-06-12 14:29:33

标签: python pathlib

我正在尝试将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

通常,我是从path/to的当前工作目录中获取pysftp的,所以使用'/'.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

在Windows上运行时,是否可以强制os.path.join()pathlib.Path使用Posix分隔符?我尝试设置sep的{​​{1}}属性,但是似乎每个路径都必须单独完成,即使它没有引发Path并且看起来没有想让我直接实例化AttributeError类。

PosixPath

尝试通过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“欺骗” os.name = 'posix'模块

os.sep = '/'

没关系,我正在运行python 3.7.0

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.

1 个答案:

答案 0 :(得分:1)

类似于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的另一种方法是使用正斜杠/作为代码中的路径分隔符。这是跨平台的。

'path/to/somefile.txt'