使用远程 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 分隔符?我尝试设置 Path
的 sep
属性,但似乎必须为每个路径单独完成,即使它没有引发 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
导入 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
的替代方法是在代码中使用正斜杠 /
作为路径分隔符。这是 cross-platform.
'path/to/somefile.txt'
我正在尝试将 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 分隔符?我尝试设置 Path
的 sep
属性,但似乎必须为每个路径单独完成,即使它没有引发 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
导入 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
的替代方法是在代码中使用正斜杠 /
作为路径分隔符。这是 cross-platform.
'path/to/somefile.txt'