如何比较跨平台pathlib路径?
How to compare cross-platform pathlib paths?
我想比较 python unittests
中的路径,有时在 windows 上,有时在 linux
.
上
我正在使用 pathlib
,因为它似乎是使用 python 3.4 和更新版本时的方式。
import Path from pathlib
base_dir = Path('~/dev/test').expanduser() # String is given
wdir = base_dir.joinpath('examples/text') # Some other given path
print(wdir)
# on Windows: WindowsPath(C:/Users/myUser/dev/test/examples/text)
# on Linux: PosixPath(/home/myUser/dev/test/examples/text)
wdir
好像完全不一样
如何进行比较以识别这两个路径在语义上相同?
差异只是因为平台不同,有没有比较跨平台路径的好方法(Windows,GNU/Linux)?
- 如果唯一的区别是
C:/Users
和 /home
,您可以比较 .parts
- 如果这不起作用,有一些 Methods and Properties 可能会起作用。
parts
列表可以转换为 sets, and then test a path for containment of the target path, using issubset
。
from pathlib import Path
w = WindowsPath('C:/Users/myUser/dev/test/examples/text')
l = PosixPath('/home/myUser/dev/test/examples/text')
w.parts
[out]:
('C:\', 'Users', 'myUser', 'dev', 'test', 'examples', 'text')
l.parts
[out]:
('\', 'home', 'myUser', 'dev', 'test', 'examples', 'text')
# comparison
l.parts[2:] == w.parts[2:]
[out]:
True
# case issues can be resolved by mapping str.lower
list(map(str.lower, w.parts))
# use sets to determine if the target path is a subset of os_path
def test_path(os_path: Path, target: Path):
target = set(w.parts)
os_path = set(map(str.lower(os_path.parts)))
assert target.issubset(os_path)
我想比较 python unittests
中的路径,有时在 windows 上,有时在 linux
.
我正在使用 pathlib
,因为它似乎是使用 python 3.4 和更新版本时的方式。
import Path from pathlib
base_dir = Path('~/dev/test').expanduser() # String is given
wdir = base_dir.joinpath('examples/text') # Some other given path
print(wdir)
# on Windows: WindowsPath(C:/Users/myUser/dev/test/examples/text)
# on Linux: PosixPath(/home/myUser/dev/test/examples/text)
wdir
好像完全不一样
如何进行比较以识别这两个路径在语义上相同?
差异只是因为平台不同,有没有比较跨平台路径的好方法(Windows,GNU/Linux)?
- 如果唯一的区别是
C:/Users
和/home
,您可以比较.parts
- 如果这不起作用,有一些 Methods and Properties 可能会起作用。
parts
列表可以转换为 sets, and then test a path for containment of the target path, usingissubset
。
from pathlib import Path
w = WindowsPath('C:/Users/myUser/dev/test/examples/text')
l = PosixPath('/home/myUser/dev/test/examples/text')
w.parts
[out]:
('C:\', 'Users', 'myUser', 'dev', 'test', 'examples', 'text')
l.parts
[out]:
('\', 'home', 'myUser', 'dev', 'test', 'examples', 'text')
# comparison
l.parts[2:] == w.parts[2:]
[out]:
True
# case issues can be resolved by mapping str.lower
list(map(str.lower, w.parts))
# use sets to determine if the target path is a subset of os_path
def test_path(os_path: Path, target: Path):
target = set(w.parts)
os_path = set(map(str.lower(os_path.parts)))
assert target.issubset(os_path)