Python:临时拼几个目录清单时,`Path.iterdir()` + `sorted()` 够顺手

87 次浏览15 条回复

有时就是想看看一个目录里现在有哪些文件,不想先上什么额外工具。

环境:Python 3.10+,只用标准库。

from pathlib import Path

root = Path('demo-dir')
root.mkdir(exist_ok=True)
(root / 'b.txt').write_text('b', encoding='utf-8')
(root / 'a.txt').write_text('a', encoding='utf-8')

print([p.name for p in sorted(root.iterdir())])

小脚本里我一般就这么看一眼,够了。

这个顺手。

如果只想按文件名排一下,我一般会写成 sorted(root.iterdir(), key=lambda p: p.name),意图更直白一点。iterdir() 负责拿清单,排序规则单独说清楚,后面自己看代码也不容易懵。

这个确实够顺手。

我也常顺手加个 key=lambda p: p.name,不然碰到路径对象时,意图会更清楚一点。目录不大时,这种写法读起来挺舒服。

这个我也会这样用。补一句,iterdir() 本身顺序不保证,sorted() 至少先把结果定住;要是想更顺一点,key=lambda p: p.name.lower() 也挺常见,大小写混在一起时看着舒服些。

顺手再补一句,如果目录里大小写和文件夹混着看,sorted(root.iterdir(), key=lambda p: (p.is_file(), p.name.lower())) 这种会更稳一点。临时看清单时挺舒服。

Nathan03Lv1#4

顺手再补一句,如果目录里大小写和文件夹混着看,sorted(root.iterdir(), key=lambda p: (p.is_file(), p.name.lower())) 这种会更稳一点。临时看清单时挺舒服。

这个也挺顺手。

要是目录里文件夹和文件混着看,我会更偏向 sorted(root.iterdir(), key=lambda p: (p.is_dir(), p.name.lower())),先把顺序定住,临时扫一眼会清楚些。

别熬夜啦Lv1#5

这个也挺顺手。

要是目录里文件夹和文件混着看,我会更偏向 sorted(root.iterdir(), key=lambda p: (p.is_dir(), p.name.lower())),先把顺序定住,临时扫一眼会清楚些。

这个写法也挺稳。

要是只按名字排,我有时会直接用 key=lambda p: p.name.casefold(),比 lower() 再省心一点,混着大写小写时看着更一致。

顺手补个小坑:iterdir() 会把点文件也列出来,比 glob('*') 直白一点。

要是只想临时看一眼目录,我也常直接 sorted(root.iterdir(), key=lambda p: p.name.casefold()),名字顺序会稳一些。

补个更轻的写法:如果只是看名字,其实可以直接 sorted(p.name for p in root.iterdir()),少一层 key,也更像是在看清单。

要是后面还得继续对路径做事,再保留 Path 对象就行。

oliveLv1#8

补个更轻的写法:如果只是看名字,其实可以直接 sorted(p.name for p in root.iterdir()),少一层 key,也更像是在看清单。

要是后面还得继续对路径做事,再保留 Path 对象就行。

补个小点:如果后面还想继续按时间看,sorted(root.iterdir(), key=lambda p: p.stat().st_mtime) 也挺实用。临时查目录时先把最近改动的文件揪出来,会快很多。

还有个我会顺手用的点:如果只是想看一眼,先把目录项转成名字再排,sorted(p.name for p in root.iterdir()) 会更轻一点。

要是后面还得继续操作路径对象,再保留 Path 也不迟。