MENU

Pythonでファイル名を1・2・10の順に並べる

当ページのリンクには広告(PR)が含まれていることがあります。
Pythonでファイル名を1・2・10の順に並べる。報告書1・10・2、数字を分ける、1・2・10の順の処理例。

報告書1、報告書10、報告書2の順に並ぶのは、名前全体を文字列として比べているためです。番号を人が読む順に並べたいなら、名前の数字の部分だけを数値として比較する方法があります。

名前を001、002へ改名しなくても、一覧を作るときの並び方だけ変えられます。元のファイルを動かさず、比較用の値をkey関数で作ります。

目次

数字と文字を別の比較値にする

次は架空の三つの名前を並べる例です。正規表現でASCII数字を取り出し、数字以外の部分は文字列として比べます。ファイルを開いたり、名前を書き換えたりする処理はありません。

import re

def filename_key(name):
    parts = re.split(r"([0-9]+)", name)
    tokens = []
    for part in parts:
        if re.fullmatch(r"[0-9]+", part):
            tokens.append((1, int(part)))
        else:
            tokens.append((0, part.casefold()))
    return tuple(tokens), name

names = ["報告書10.csv", "報告書2.csv", "報告書1.csv"]
ordinary = sorted(names)
natural = sorted(names, key=filename_key)
print("文字列の順:", ordinary)
print("数字を読む順:", natural)
assert natural == ["報告書1.csv", "報告書2.csv", "報告書10.csv"]
assert names == ["報告書10.csv", "報告書2.csv", "報告書1.csv"]
assert filename_key("報告書01.csv") != filename_key("報告書1.csv")

通常の文字列の順は1、10、2、比較用の値を使うと1、2、10です。Windows・Python 3.12.10で、この結果と元の一覧が変わらないことを確認しました。

数値の前に1、文字列の前に0を付けているのは、異なる種類の値を直接比較しないためです。数字で始まる名前と文字で始まる名前も、この例で決めた規則に従って並びます。

01と1が並んだ場合の規則

01と1は数値にすると同じ1になります。どちらを先にするかが必要なら、同順位の条件も決めます。この関数は比較用トークンの次に元の名前を比べる指定です。

大文字小文字は比較用トークンでcasefoldしていますが、元の名前は残しています。大文字小文字だけ違う名前があれば、最後の比較は元の文字列によって決まります。共有先で期待する順序に合うか、小さな例で確認してください。

すべての名前の意味は読めない

この処理は数字の並びを整数として比べるだけです。日付の妥当性、版番号の意味、和暦、日本語の読みを理解しているわけではありません。v1.10とv1.2なども、業務でどんな順序を期待するかを別に確かめます。

Windowsのファイル一覧と完全に同じ照合規則を再現する例でもありません。生成する一覧や処理順に使うなら、そのツールで採用した並び方として説明します。

実フォルダーへ使う場合も、最初はパスの一覧を並べて表示するだけにします。改名や連番の振り直しは別の操作です。入力順に意味がある作業では、並べ替える前の順番も残してください。

名前変更の試運転は一括リネームの基本、文字の分割や置換はPythonの文字列操作で補えます。

参考資料

Pythonのソートとreの公式資料を2026年11月1日に確認しました。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次