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

Python中os.listdir文件名排序异常求助——期望按数字逻辑排序文件名

解决Python中文件名自然排序的问题

这是典型的字典序排序和自然排序的冲突问题——os.listdir()默认会按照系统的字典序返回文件列表,而字典序是逐个字符比较ASCII码值的:比如121a和1a比较时,第一个字符都是1,第二个字符2的ASCII码比a小,所以121a会排在1a前面,这和我们期望的按数字大小排序逻辑不符。

下面给你两种可行的解决方案:

方案一:使用第三方库natsort(最简单)

natsort是专门处理自然排序的库,用它可以一行搞定排序:

  1. 先安装库:
pip install natsort
  1. 修改代码使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:22:34