Python 複数ファイル名の番号順に、ファイルをソート(並び替え)する

'23/02/28更新:使い勝手を考慮して関数にしました。引数をファイルパスリストにして、戻り値はソートされたファイルパスリストで返します。
 本記事では、下図のようにファイル名の番号順にソートする雛形コードを載せました。OS上では、ファイル名は文字列であるために下図左のような並びになり、aaa_1, aaa_2, aaa_3,…とはならずに、aaa_1, aaa_10, aaa_2, aaa_20になってしまいます。これを下図右のような番号順に並び替えるためには、一旦、番号部分を抽出してソートすることで対応できます。

ソート前のファイル順 ソート後のファイル順
aaa_1.txt aaa_1.txt
aaa_10.txt aaa_2.txt
aaa_2.txt aaa_3.txt
aaa_20.txt aaa_10.txt
aaa_21.txt aaa_20.txt
aaa_3.txt aaa_21.txt

下図のようにファイルパスを含めた並び替えをします。

f:id:HK29:20220203222007p:plain

■本プログラム

import glob
import re
import os

# ファイルパスをリストで取得する
file_path_list = glob.glob('./folder/*.txt')
print(file_path_list)

# ソート(並び替え)する関数
# 引数は、ファイルパスリスト。戻り値は、ソートされたファイルパスリスト
def sort_func(_file_path_list):
    # ファイルパスからファイル名の取得
    file_name_list = [os.path.basename(file_path) for file_path in _file_path_list]
    #print(file_name_list)

    # ファイルを番号でソートする
    file_name_list_sorted = sorted(file_name_list, key=lambda x:int((re.search(r"[0-9]+", x)).group(0)))
    file_name_list_sorted
    
    # フォルダパスを取得する方法
    dir_path = os.path.dirname(_file_path_list[0])
    #print(dir_path)
    
    # 新しいファイルリストを作成する
    _new_file_path_list = [os.path.join(dir_path, file) for file in file_name_list_sorted]
    
    return _new_file_path_list

# ファイルパスリストを引数に与えると、ソートされたファイルパスリストが返ってくる
new_file_path_list = sort_func(file_path_list)
print(new_file_path_list)

●参考
ExcelVBAで同様のことをする雛形コードは次のリンク先です。

VBA フォルダパスをダイアログから取得する。更にそのフォルダ内のファイル名をソートして取得する - PythonとVBAで世の中を便利にする 本記事のPythonコードと比較すると、明らかにPythonが短いコードで書けて簡単簡潔であることがわかります。

以上

<広告>