Windows资源管理器文件名排序

Posted Wan-deuk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows资源管理器文件名排序相关的知识,希望对你有一定的参考价值。

Windows资源管理器文件名排序

这学期担任了本科生教学助教,平时有逐个批改学生作业(作业通常按学生名字进行命名)然后记录成绩到另外一个文件的需求。为了加快批改作业的效率,考虑把作业文件夹里面的作业的文件名抽取出来,拷贝到成绩文件里面,这样当按照Windows资源管理器排的顺序批改完作业后,可以很快地把成绩加到作业文件名的后面(顺序是一致的,登记成绩时省了找作业对应的学生所在位置的时间)。

想法是美好的,现实是打脸的:通过Python遍历目录得到的文件名和Windows资源管理器中显示的文件名的顺序是不一样的,比如Python遍历目录得到文件名列表是[\'万xx.jpg\', \'何xx.jpg\', \'何xx.jpg\', \'余xx.jpg\'],而Windows资源管理器中显示的却是[\'安xx.jpg\', \'白x.jpg\', \'曹xx.jpg\', \'陈xx.jpg\']。一开始我以为后者是按拼音进行排序的,还尝试了安装能够把中文转换成拼音的模块,基于文件名的拼音进行排序,但实际上该顺序与通过拼音得到的顺序仍然有部分不同。通过网上查阅资料发现,Windows资源管理器是按照所谓的自然排序的方法进行排序的。

背景:自然排序

什么是自然排序?

“naturally” is rather ill-defined, but in general it means sorting based on meaning and not computer code point

怎样按自然排序的规则进行排序?

  • Java的类可以通过实现Comparable接口、重写compareTo方法指定自然排序的规则;

  • Python通过为函数list.sort或sorted的key参数指定排序规则即可,比如:sorted([\'a\', \'b\', \'c\', \'A\', \'B\', \'C\'], key=str.lower)得到[\'a\', \'A\', \'b\', \'B\', \'c\', \'C\']

基于Python的解决方案

  1. 通过pip安装natsort库: pip install natsort

  2. 设置当前语言环境为zh_CN.UTF-8:

import locale
locale.setlocale(\'zh_CN.UTF-8\')
  1. 导入natsort库进行排序:natsorted(filenames, alg=ns.LOCALE)

完整代码如下:

import locale
from pathlib import Path

from natsort import natsorted, ns

locale.setlocale(\'zh_CN.UTF-8\')
basedir = Path(\'path/to/folder\')
filenames = [file.stem for file in basedir.iterdir()]  # file.stem表示取文件的名字(不包含文件扩展名)
filenames_sorted = natsorted(names, alg=ns.LOCALE)
print(filenames_sorted)

参考材料

  1. python对列表排序之高级模块natsort
  2. Python对os.listdir()获取的文件列表进行Windows的按名称方式排序,natsort库的应用
  3. Python在windows下自然排序
  4. 十七、实现Windows中的文件名排序
  5. natsort · PyPI
  6. 自然排序和定制排序

以上是关于Windows资源管理器文件名排序的主要内容,如果未能解决你的问题,请参考以下文章

Java - 像 Windows 资源管理器一样对字符串进行排序

如何像在 Windows 资源管理器中一样在 Delphi 中获取排序顺序?

Windows 资源管理器中文件夹的“修改日期”规则

如何在命令提示符窗口中列出按数字排序的目录中的文件名?

如何使用Android片段管理器传递变量[重复]

massCode 一款优秀的开源代码片段管理器