🗃️

【Python】リネームやフォルダ移動、日付付与など汎用的なファイル編集・操作システム

に公開

はじめに

今回、ファイル名の一括リネームやファイル選択、ディレクトリ移動を簡単なコマンド操作で実行できるPythonファイル編集・操作システムを作りました。

https://github.com/Benjuwan/ctrl-files-py

筆者は会社ではmacOS 15 Sequoia Apple M1、私用ではWindows11を使っています。
実は、Macには標準で素晴らしいファイルリネーム機能(*1)が付いているのですが、Windowsにはありません。
そこで今回、Pythonのキャッチアップを兼ねて作ってみた次第です。

*1:ファイルを複数選択して右クリック[名称変更...]を押下すると以下キャプチャ画像が開かれてリネーム作業が行えます。

そもそも今日日、AI(例:Gemini CLIのような)があるので別にPythonでファイル編集・操作システムなんて作らなくても……って話ではありますが


本Pythonファイル編集・操作システムの具体的な機能は以下になります。

プロジェクトのルートに/file/renameという処理対象用のディレクトリを用意する必要があります。
/file/renameを手動で用意せずとも以下コマンドを実行することでディレクトリ有無を判断して生成してくれます。

% cd utils
% python rename_files_sys.py

# `/file/rename`が存在しない場合は以下が表示される
file/renameが存在しないので作成します

機能一覧

  • ファイル名の一括リネーム
    • 指定した文字列の置換
    • 以下機能は特定ファイルを単体実行した場合
      • ナンバリング(連番付与)
      • ファイル名の先頭・末尾への任意の文字列を追加
        • ファイル名の先頭に当日(yyyymmdd)を表記
      • 複数モード(全置換・部分置換・追加のみ等)に対応
  • 拡張子によるファイル選択
    • 特定の拡張子を持つファイルのみを対象に処理可能
    • サブディレクトリも含めた再帰的な検索に対応
  • ディレクトリ移動・作成
    • 指定したディレクトリへのファイル移動
    • 必要に応じてディレクトリを自動作成

想定用途

  • 大量のファイル名の一括変換や整理
  • プロジェクトや業務での命名規則統一
  • ファイルの分類・移動・バックアップの処理自動化

使い方

「汎用機能ver」と「ファイル名の編集特化ver」の2通りの使い方があります。

汎用機能ver

main.py実行ルートで、「ファイルの部分置換に加えて、フォルダ移動や対象ファイル選択」が行えます。

このルートでは(renameディレクトリ内の)各種ファイルに以下処理を行えます。

  1. ファイルの部分置換 + フォルダ移動 + ファイル選択(※拡張子指定)
  2. ファイルの部分置換 + フォルダ移動
  3. ファイルの部分置換 + ファイル選択
  4. ファイルの部分置換

例えば、1ルートを実行した場合のターミナル画面は以下のようになります。

ファイル名の部分置換処理をスタート(y/n で入力):y
フォルダ移動を行いますか?(y/n で入力):y
ファイルを選択(※拡張子指定)しますか?(y/n で入力):y
モード:フォルダ移動 + ファイル選択 + リネーム
1. リネーム前の対象文字列を入力:bn
2. リネーム名を入力:バナー
移動先フォルダ名を入力:dist
処理対象ファイルの拡張子を入力:jpg
../file/rename/bn_kari02.jpg -> ../file/rename/バナーkari02.jpg
../file/rename/bn_kari01.jpg -> ../file/rename/バナーkari01.jpg
Done | すべての処理が完了しました.

ちなみに、移動先フォルダ名を入力で入力した移動先フォルダが存在しない場合は作成するようになっています。

移動先フォルダ名を入力:dist
`check_and_create_move_dir` | 処理対象フォルダ「dist」が存在しません
「dist」を作成したので再実行してください

また、処理対象のファイル(拡張子)が存在しない場合は通知及び処理ストップするようになっています。

  • そもそも処理対象フォルダ内に存在しない拡張子ファイルを指定した場合
ファイル名の部分置換処理をスタート(y/n で入力):y
フォルダ移動を行いますか?(y/n で入力):n
ファイルを選択(※拡張子指定)しますか?(y/n で入力):y
モード:ファイル選択 + リネーム
1. リネーム前の対象文字列を入力:バナー
2. リネーム名を入力:bun-
処理対象ファイルの拡張子を入力:png
`files_select` | ../file/renameフォルダまたは当該フォルダ内に「png」拡張子ファイルは存在しません
  • 指定した拡張子ファイルがキーワードを含んでいない場合
ファイル名の部分置換処理をスタート(y/n で入力):y
フォルダ移動を行いますか?(y/n で入力):n 
ファイルを選択(※拡張子指定)しますか?(y/n で入力):y
モード:ファイル選択 + リネーム
1. リネーム前の対象文字列を入力:バナー
2. リネーム名を入力:bun-
処理対象ファイルの拡張子を入力:pdf
`files_select` | ファイル名に「バナー」を含んだ「pdf」拡張子ファイルは存在しません

ファイル名の編集特化ver

rename_files_sys.py実行ルートで、「ファイル名の編集特化(全置換, 部分置換, 任意の文字列追加, 日付の追加)」が行えます。

注意事項として実行時には後述するコマンドライン引数(all, part, add_begin, add_end)がそれぞれ必要となります。

このルートでは(renameディレクトリ内の)各種ファイルに以下処理を行えます。

  1. ファイル名の全置換
    • 対応コマンド:all
  2. ファイル名の部分置換(ページ -> page
    • 対応コマンド:part
  3. ファイル名の「先頭」に指定した文字列を追加
    • 対応コマンド:add_begin
  4. ファイル名の「末尾」に指定した文字列を追加
    • 対応コマンド:add_end

3と4のファイル名の先頭または末尾への文字列追加処理では、ファイル名の先頭に当日(yyyymmdd)を表記できるような分岐機能も設けています。
(※先のキャプチャgifでは日付を付与しています)

また、「1.ファイル名の全置換」処理では同じ拡張子ファイルが重複している場合は同じ拡張子のファイルがあります。重複ファイルは作成不可という通知文がターミナルに表示されて、そこで処理ストップするようになっています。
ナンバリング(連番付与)機能を併用すれば重複ファイルがあっても問題なく全置換できます。

作ってみて

正直、色々と機能を盛り込みすぎた感が否めません。

各種リネームやフォルダ移動、ファイル選択など処理別にモジュール分離していますが、それでも可読性や保守性が犠牲になっているような気がします。
さらに、スキル不足から冗長な記述になっている箇所もあることでしょう。

しかし、Pythonは書いていて楽しく、構文や特性もシンプルでわかりやすいですし、オフサイドルール(インデントが影響を及ぼす)も慣れてしまえばしっくりきました。

JavaScriptと同じく動的型付け言語ということもあって、筆者にとって馴染みやすい部分もあったかもしれません。

ただ、フロントエンドでは経験したことがない、globosライブラリでのファイル操作関連や、sysライブラリやinputなどコマンド関連の仕組みなどで詰まった部分も多々ありました。

他にも、Python独自の内包表記lambda関数など簡潔で分かりやすい仕組みが用意されていて、こういった開発体験の良さも多くの方に選ばれている理由の一つなのかなと思ったりしていました。

とは言え、三項演算子やmap,filterメソッドの書き方は個人的に JavaScript のほうが分かりやすい気がします。

  • 三項演算子
条件 ? true : false;
True if 条件 else False
  • map,filter
iter.map(elm => elm.toUpperCase());
iter.filter(elm =>  elm === 'apple');
map(specific_func_a, iter)
filter(specific_func_b, iter)

特に、Pythonでは内包表記という便利な機能があるので、map,filterとの使い分け判断がうまくイメージできていない状況です。

ただ、この繰り返し処理の関数部分にlambda関数を使ってさらにシンプルでわかりやすくできる点は興味深かったです。

さいごに

Pythonの学習動機は業務効率化だったのですが十二分に恩恵を受けましたし、書いていて楽しいこともあって今後もキャッチアップを続けていく所存です。

Python自身に大きな汎用性や将来性があるので、テストなども学びながらフレームワーク(Django)の習得に進んで行きたいです。

本記事の「Pythonファイル編集・操作システム」に関心を持ってくださった方は自由に使ってください。

https://github.com/Benjuwan/ctrl-files-py

ここまで読んでいただき、ありがとうございました。

Discussion