如何对os.listdir()返回的日期格式文件名进行自定义排序?
解决方案:按月份+日期排序TXT文件
问题场景
你有一批命名格式为Month day.txt的TXT文件,os.listdir('.')返回的默认排序不符合预期:
["April 30.txt", "April 4.txt", "May 1.txt", "May 10.txt", "May 11.txt", "May 2.txt"]
期望排序结果:
["April 4.txt", "April 30.txt", "May 1.txt", "May 2.txt", "May 10.txt", "May 11.txt"]
需要实现先按月份顺序、再按日期数字排序的逻辑,此前的代码仅能按日期数字排序,无法处理月份维度的排序。
实现代码
直接使用calendar模块配合正则捕获月份和日期,以元组作为排序键即可实现需求:
import os import re import calendar # 获取当前目录下的目标文件 files = os.listdir('.') # 精准匹配"Month day.txt"格式的文件名,捕获月份和日期 pattern = re.compile(r'^(\w+) (\d+)\.txt$') # 过滤掉不符合格式的文件(可选) target_files = [f for f in files if pattern.match(f)] # 排序:先按月份顺序,再按日期数字排序 sorted_files = sorted(target_files, key=lambda x: ( calendar.month_name.index(pattern.match(x).group(1)), int(pattern.match(x).group(2)) )) print(sorted_files)
代码说明
- 正则匹配:
^(\w+) (\d+)\.txt$精准匹配文件名格式,第一组捕获月份名称,第二组捕获日期数字; - 月份排序依据:
calendar.month_name是包含12个英文月份全称的列表(首字母大写),通过index()方法获取月份对应的数字(比如April对应4,May对应5),保证月份按自然顺序排序; - 日期排序:将捕获的日期字符串转为整数,避免字符串排序的逻辑错误(比如字符串"10"会比"2"小);
- 排序键:元组
(月份索引, 日期整数)会先比较月份索引,相同月份再比较日期数字,完全符合你的排序需求。
额外说明
如果你的文件名中月份是缩写(比如Apr 4.txt),只需将calendar.month_name替换为calendar.month_abbr即可,该列表包含月份的英文缩写(首字母大写)。
内容的提问来源于stack exchange,提问作者Zen
相关产品推荐
相关产品推荐

