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
相关产品推荐
相关产品推荐

