在 Python 中对文件名按照数值排序

对数据集的文件名正确排序

有些训练或评估程序要求数据集输入文件的顺序严格有序 1,但是文件名长度又不同,不能简单按照字典序来排序。比如,数据集的标签文件名可能是 0.txt、1.txt……10.txt 等,能想到的一个方法是在前面填充字符 '0'

lst = os.listdir(directory)
lst = sorted(lst, key=lambda s : s.zfill(50))

如果先去掉后缀名,然后再把前面的字符串转数字,则可能会遇到很多复杂的情况(比如多重后缀名),比不上在前面填充字符简单。

zfill 填充好之后,文件名都是这样的:

00000...001.txt
00000...002.txt
...
00000...100.txt

这样直接按照字典序排序就可以了。

其他和填充相关的格式化方法

Python 中用来填充的方法还是挺多的,比如 rjust()ljust()center() 方法分别是向右对齐、向左对齐、居中对齐,还能自己选择用来对齐的字符(默认是空格)。因此,rjust() 实际上是 zfill() 功能的超集。

Tip

Python 中没有字符类型,只有字符串,所以字符其实是长度为 1 的字符串。

除了这三个函数之外,使用 f-string 也能完成字符串的对齐,比如:

>>> f'{"A":<16}'
'A               '
>>> f'{"A":-<16}'
'A---------------'
>>> f'{"A":-^16}'
'-------A--------'
>>> f'{"A":->16}'
'---------------A

  1. 最好避免这一做法。但是很多时候时间仓促,又或者接手的代码就是这样,只能临时修补一下。 ↩︎