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. 自然排序和定制排序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM