微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何比较跨平台的pathlib路径?

如何解决如何比较跨平台的pathlib路径?

我想比较我的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,然后使用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','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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。