如何结合methodcaller与attrgetter实现PosixPath列表按文件大小排序
对PosixPath列表按文件大小排序的几种方法
嘿,这个需求其实很好实现,不用纠结怎么硬凑operator.methodcaller和operator.attrgetter——当然也有办法结合,但最直观的方式反而更简单,咱们一个个说:
方法一:用Lambda表达式(最推荐)
这是最直接易懂的方式,lambda可以直接链式调用方法和属性,完美匹配你的需求:
from pathlib import Path # 假设你的PosixPath列表是这个 paths = [Path("file1.txt"), Path("image.png"), Path("data.zip")] # 按文件大小升序排序 sorted_paths = sorted(paths, key=lambda p: p.stat().st_size) # 如果要降序,加reverse=True sorted_paths_desc = sorted(paths, key=lambda p: p.stat().st_size, reverse=True)
这里lambda函数接收每个PosixPath对象p,先调用它的stat()方法拿到os.stat_result,再直接取出st_size属性作为排序key,逻辑清晰到一眼就能懂。
方法二:结合operator模块与functools.compose(适合复用场景)
如果你确实想用operator里的工具来实现,可以用functools.compose把两个操作组合起来——不过这个需要Python 3.10及以上版本:
from pathlib import Path from operator import methodcaller, attrgetter from functools import compose paths = [Path("file1.txt"), Path("image.png"), Path("data.zip")] # 先调用stat()方法,再取st_size属性 key_func = compose(attrgetter("st_size"), methodcaller("stat")) sorted_paths = sorted(paths, key=key_func)
compose的作用是把后面的函数结果传给前面的函数,也就是先执行methodcaller("stat")拿到stat对象,再把这个对象传给attrgetter("st_size")取出大小。如果你的Python版本低于3.10,也可以自己写一个简单的compose函数,不过说实话,这种场景下lambda反而更省事。
补充说明
- 注意:如果列表里有不存在的文件,调用
stat()会抛出FileNotFoundError,最好提前过滤掉这些无效路径,或者用try-except处理。 - 排序默认是升序(从小到大),如果需要从大到小排序,记得加上
reverse=True参数。
内容的提问来源于stack exchange,提问作者Ben2209
相关产品推荐
相关产品推荐

