Pythonでの処理が終わったファイルを、
手動で「今日の日付」のフォルダに移動してるんだけど、
ファイルの移動もPythonで自動化できないかな…?
できますよ!
「ファイルを移動させる方法」と
本日の日付フォルダを最終的に「処理済」フォルダへ移動する
「フォルダを移動させる方法」も併せて解説いたします!
【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。
Pythonでファイルやフォルダを移動させるには
「shutil」の「move」を使います。まずは実行見本をどうぞ。
実行見本
全コード
ひとまず全コードを網羅します。解説は後ほど行います。
import shutil
shutil.move('C:/Utatane/input.xlsx', 'C:/Utatane/0413Sat')
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
【状況】
現在、Cドライブの中に「Utatane」というフォルダがあります。
その中にある「input.xlsx」というエクセルファイルを、「0413Sat」というフォルダに移動させてみましょう。
インポート
import shutil
ファイルやフォルダを移動させるには、「shutil」のインポートが必要です。
まずは上記一文を記述して、「shutil」をインポートしましょう。
ファイルの移動
shutil.move('C:/Utatane/input.xlsx', 'C:/Utatane/0413Sat')
上記一文でファイルを移動させることができます。
【 shutil.move(‘現在のフォルダパス/移動させたいファイル名‘, ‘移動後のフォルダパス‘) 】
これで移動させたいファイル(今回は「input.xlsx」)を移動後のフォルダ(今回は「0413Sat」)へ移動させることができました。
フォルダパスやファイル名を間違うと、エラーが出る場合があります。
また、エラーが出なくても、違うファイルを移動してしまったり、違う場所に移動してしまう可能性があります。フォルダパスやファイル名は間違えないようにしましょう。
移動後のフォルダが存在しない場合、とんでもないことが起こります。
移動させたいファイルのファイル名が移動後に指定したフォルダ名に置き換わってしまいます。
大切なデータが失われる場合がありますので注意しましょう。
shutil.move('C:/Utatane/input.xlsx', 'C:/Utatane/あああ')
日付入りフォルダもPythonで自動作成できます。下記記事をご参考ください。
フォルダの移動
では次に、今日の日付フォルダ「0413Sat」を「処理済」フォルダに移動してみましょう。
shutil.move('C:/Utatane/0413Sat', 'C:/Utatane/処理済')
前項のファイル移動と比べて、ファイルの部分(/ファイル名)が無くなっただけです。
実行してみます。
フォルダを移動できました。
今回は、
「’C:/Utatane/0413Sat’」
という指定をしましたが、最後の「/」以降のフォルダやファイルが移動対象です。
上記の場合は、「0413Sat」フォルダが移動対象で、
「’C:/Utatane’」と指定した場合は、「Utatane」フォルダが移動対象です。
移動後のフォルダが存在しない場合、現在のフォルダ名が移動後のフォルダ名に置き換わってしまいます。
shutil.move('C:/Utatane/あああ', 'C:/Utatane/いいい')
その後のプログラムで「あああ」フォルダを指定したのに存在しないというような、予期せぬエラーが起こる可能性があるため注意が必要です。
ファイル名に日付が入っている場合の対処法
見本で移動させた「input.xlsx」ですが、「0413input.xlsx」のように日付が入っていた場合、
通常であれば毎回コードを変える必要があります。
しかしそんなことをすると、せっかく自動化した意味がありません。
コードを変えなくても済む方法を紹介いたしますので、ぜひご活用ください。
▼コード
import shutil
import glob
files = glob.glob('C:/Utatane/*input*.xlsx')
for file in files :
shutil.move(file, 'C:/Utatane/0413Sat')
▼解説
globを使って、ファイル名を部分一致で取得しています。
そのファイルパス(フォルダパス+ファイル名)である「file」をmoveの「現在のファイルパス」に入れています。
globについては下記記事で解説しております。ご参考ください。
for文については、下記記事をご参考ください。
これでファイル名に特定の文字(今回は「input」)が入っているファイルを全て移動することもできます。
また、日付でなくても「input01」「input02」など、連番や他の文字が付いていても対応できます。
さらに応用編として、「*.xlsx」という指定をすることで、全ての「xlsx」ファイルを移動させることができます。
目的に応じてご活用ください。
うまく動作しない時の対処法
エラーが出る
No such file or directory: ‘xxx’
「FileNotFoundError: [Errno 2] No such file or directory: ‘xxx’」は「指定したフォルダがありません」というエラーです。
moveで指定した「現在のファイルパス」もしくは「移動後のファイルパス」が間違っている可能性があります。
実際のファイルパスと、指定のファイルパスを見比べてみましょう。
詳細は下記記事をご参考ください。
Destination path ‘xxx’ already exists
「Error: Destination path ‘xxx’ already exists」は、「指定したフォルダにファイルが既にあります」というエラーです。
移動後のフォルダの中に、同じ名前のファイルやフォルダが存在する場合、エラーが出て実行することができません。
既に存在しているファイルやフォルダを削除するか移動させましょう。
最後に
Pythonでファイルやフォルダを移動させる方法を解説いたしました。
今回の見本のように、処理済のファイルやフォルダを移動させることで、自動化がワンランクアップしてさらに効率的になります。ぜひご活用ください。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!