You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:36:56