Python中os.listdir文件名排序异常求助——期望按数字逻辑排序文件名
解决Python中文件名自然排序的问题
这是典型的字典序排序和自然排序的冲突问题——os.listdir()默认会按照系统的字典序返回文件列表,而字典序是逐个字符比较ASCII码值的:比如121a和1a比较时,第一个字符都是1,第二个字符2的ASCII码比a小,所以121a会排在1a前面,这和我们期望的按数字大小排序逻辑不符。
下面给你两种可行的解决方案:
方案一:使用第三方库natsort(最简单)
natsort是专门处理自然排序的库,用它可以一行搞定排序:
- 先安装库:
pip install natsort
- 修改代码使用
natsorted排序:
import os from natsort import natsorted path = r"C:\Users\Admin\Downloads\Telegram Desktop\number test" files = os.listdir(path) # 用natsorted进行自然排序 sorted_files = natsorted(files) print(path) for file in sorted_files: print(file)
运行后就能得到你期望的顺序:1a.txt、121a、151a.txt。
方案二:自定义排序key(无需第三方库)
如果不想额外安装库,可以自己写一个排序key函数,通过正则拆分文件名中的数字和非数字部分,把数字转换成整数再参与排序:
import os import re def natural_sort_key(filename): # 用正则把文件名拆分成「非数字段」和「数字段」的交替列表 parts = re.split(r'(\d+)', filename) # 数字段转成整数,非数字段转小写(可选,用于不区分大小写排序) return [int(part) if part.isdigit() else part.lower() for part in parts] path = r"C:\Users\Admin\Downloads\Telegram Desktop\number test" files = os.listdir(path) # 使用自定义key进行排序 sorted_files = sorted(files, key=natural_sort_key) print(path) for file in sorted_files: print(file)
这个函数的逻辑是:把每个文件名拆分成类似['', '1', 'a.txt']、['', '121', 'a']这样的片段,然后把数字片段转成整数,这样排序时数字就会按数值大小比较,而非数字部分保持字符顺序(转小写是为了统一大小写,比如避免A和a排序不一致,如果不需要可以去掉.lower())。
内容的提问来源于stack exchange,提问作者JDebook
相关产品推荐
相关产品推荐

