我正在尝试将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.
答案 0 :(得分:1)
类似于os
的情况下,ntpath
或posixpath
的导入取决于它决定您的操作系统来自os.name
。不幸的是,我们知道重命名os.name
或os.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'