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

Python实现文件名自然排序(仿Windows资源管理器顺序)

自然排序文件列表(匹配Windows资源管理器顺序)

我有一个文件夹,其中的文件命名如下:

'920.jpg'
'920-1.jpg'
'920-2.jpg'

使用os.listdir()或glob.glob()方法时,得到的排序结果通常为:

[
    '920-1.jpg',
    '920-2.jpg',
    '920.jpg'
]

但我希望文件排序顺序与Windows资源管理器一致,即:

[
    '920.jpg',
    '920-1.jpg',
    '920-2.jpg'
]

1. 如何在Python中实现这种自然排序?

有两种实用方案:

方案一:使用第三方库natsort

这是最简便的实现方式,natsort专门处理自然排序,直接传入文件列表即可得到符合预期的结果:

from natsort import natsorted
import glob

# 获取目录下的jpg文件
files = glob.glob("*.jpg")
# 执行自然排序
sorted_files = natsorted(files)
print(sorted_files)

方案二:自定义排序逻辑(无需第三方库)

通过正则表达式拆分文件名中的文本和数字片段,将数字转为整数进行数值比较,实现自然排序:

import re
import os

def natural_sort_key(s):
    # 拆分字符串为文本和数字片段,数字转整数以便数值比较
    parts = re.split(r'(\d+)', s)
    return [int(part) if part.isdigit() else part.lower() for part in parts]

# 筛选目录下的jpg文件
files = [f for f in os.listdir(".") if f.endswith(".jpg")]
# 按自定义规则排序
sorted_files = sorted(files, key=natural_sort_key)
print(sorted_files)

2. 是否存在可处理此类自然排序且保留文件扩展名的内置函数或库?

Python标准库没有直接对应的内置函数,但有两种可靠方案:

  • 第三方库natsort:自动识别文件名中的数字部分,保留完整文件名(包括扩展名),排序逻辑与Windows资源管理器一致,跨平台可用。
  • Windows系统原生API:通过ctypes调用Windows的StrCmpLogicalW函数(这是资源管理器使用的排序核心函数),完全匹配Windows的排序规则,但仅适用于Windows系统:
import ctypes
import os

def windows_natural_sort(files):
    cmp_func = ctypes.windll.shlwapi.StrCmpLogicalW
    # 利用sorted的比较器机制实现原生排序
    return sorted(files, key=lambda x: (cmp_func(x, x), x))

files = [f for f in os.listdir(".") if f.endswith(".jpg")]
sorted_files = windows_natural_sort(files)
print(sorted_files)

3. 是否需要先拆分文件名与扩展名再排序?若是,最佳方式是什么?

不需要刻意拆分文件名和扩展名。无论使用natsort还是自定义排序函数,都能直接处理带扩展名的完整文件名——排序逻辑针对的是整个字符串中的文本和数字片段,扩展名会被当作普通文本处理,不会干扰排序结果。

如果确实有特殊需求需要拆分文件名与扩展名,可使用os.path.splitext()方法:

import os

filename = "920-1.jpg"
name_part, ext_part = os.path.splitext(filename)
# name_part = "920-1", ext_part = ".jpg"

但这一步对于自然排序来说完全多余,直接处理完整文件名即可。


内容的提问来源于stack exchange,提问作者Fathi Farzad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:44:58