【python】ファイルの条件を指定して一括移動する方法【コード解説】

プログラミング

フォルダ内のファイルをまとめて移動させたい!ってだけならわざわざプログラムを書くまでもありませんが、、、
名前が○○、画像のファイルだけ!など「特定の条件のファイルだけまとめて移動させたい
移動させたあとに規則性の付いた名前に変更したい」などとなると話は別です。

プログラムでサクッと時短しちゃいましょう!
解説はいいからコードだけよこせ!という方はまとめに飛んでください。

フォルダ構成

今回のフォルダ構成はこんな感じです。

move_files.py」が今回のプログラムです。

「input」フォルダ内に画像とテキストが10ファイルずつ格納されています。

ここから次の動作を行ってくれるプログラムを解説していきます。

  1. ファイルを全部「output」フォルダへ移動
  2. 画像だけを「output」フォルダへ移動
  3. ファイル名末尾が_hogeのファイルだけ「output」フォルダへ移動
  4. 移動させたファイル名を「moved_n」というファイル名へ変更

それでは順番に見ていきましょう!

コード解説

ファイルを全部「output」フォルダへ移動

まず、フォルダ移動の基本は「shutil」という標準モジュールを使用します。
フォルダ内をまとめて~でおなじみの「glob.glob」正規表現を使っていきます。

import shutil
import glob

#移動元と移動先のフォルダを定義する。
input_path = "./input/"
output_path = "./output/"

#正規表現×glob.globでinput_path内のファイル全てをリストとして取得
move_file_list = glob.glob(input_path + "*")

#リストの要素を一つずつ取り出して移動させていく。
for item in move_file_list:
    shutil.move(item, output_path)

実行後のフォルダ構成がこのようになります。ちゃんと全部移動してますね。

画像だけを「output」フォルダへ移動

次に画像だけ、つまり今回は「.png」の拡張子が付いたファイルだけ移動する方法を見ていきましょう。

正規表現の使い方を少し工夫するだけです。

#画像ファイルだけを移動。
#正規表現:.pngの前は何でもOK
move_file_list = glob.glob(input_path + "*.png")

#リストの要素を一つずつ取り出して移動させていく。
for item in move_file_list:
    shutil.move(item, output_path)

実行後のフォルダ構成がこのようになります。ここら辺からようやくプログラミングの恩恵を受けられている気がします。

ファイル名末尾が_hogeのファイルだけ「output」フォルダへ移動

今回は「ファイル名の末尾が_hoge」という条件ですが、ご自身の目的に沿ってカスタマイズしてみてください。

今回も正規表現を使います。便利ですね。

#末尾が_hogeのファイルだけ「output」フォルダへ移動
move_file_list = glob.glob(input_path + "*_hoge.???")

#リストの要素を一つずつ取り出して移動させていく。
for item in move_file_list:
    shutil.move(item, output_path)

「_hoge.」が入っていればいいよ!という意味です。

「*」というのは任意の文字列(何文字でもOK)で、「?」は任意の1文字という意味です。
つまり、「_hoge.」の後は何でもいいけど3文字という条件です。

移動させたファイル名を「moved_n」というファイル名へ変更

最後に移動させたファイル名を一括変更してみましょう。

末尾「_hoge」の画像とテキストを移動させて、名前を「moved_0.txt」、「move_0.png」、「moved_1.txt」、、、と改名していきます。

#テキストファイルを操作。
move_file_list = glob.glob(input_path + "*_hoge.txt")

for i, item in enumerate(move_file_list):
    shutil.move(item, output_path + "moved_" + str(i) + ".txt")

#画像ファイルを操作。
move_img_list = glob.glob(input_path + "*_hoge.png")

for j, img in enumerate(move_img_list):
    shutil.move(img, output_path + "moved_" + str(j) + ".png")

うまくいきましたか?プログラミングありがたい~となりますね。

移動ではなくコピーしたい場合

リネームする場合などは移動よりもコピーの方が都合がよかったりします。

そんなときは各コードの「shutil.move」「shutil.copy」に変更するだけでOKです。

先ほどの「移動してリネーム」を「コピーしてリネーム」に変えて実行するとこんな感じになります。

まとめ

いかがでしたでしょうか。

移動には「shutil.move」を使い、条件指定には正規表現を使ってきました

リネームを行わないコードはこちらのようになりました。

import shutil
import glob

input_path = "./input/"
output_path = "./output/"

#末尾が_hogeのファイルだけ「output」フォルダへ移動
move_file_list = glob.glob(input_path + "*_hoge.???")

#リストの要素を一つずつ取り出して移動させていく。
for item in move_file_list:
    shutil.move(item, output_path)

業務効率化したい!pythonを使ってみたい!という人に届くと嬉しいです。

コメント

タイトルとURLをコピーしました