この記事では、指定したフォルダ内のファイルを
まとめて別のフォルダに移動させる方法についてまとめています。
指定したフォルダ内のファイルをまとめて移動させる方法
globとshutilライブラリを組み合わせて使う
globとshutilの2つのライブラリを組み合わせて使うことで実現できます。
globで指定したフォルダ内の全ファイルを調べ、shutilで移動させるイメージです。
globで全ファイルを取得する書式は以下の通りです。
変数 = glob.glob(“*”)
globについては以下の記事を併せてご覧ください。
globの使い方。指定したフォルダ内のファイル名一覧を取得する
shutilでファイルを移動させる書式は以下の通りです。
shutil.move([移動させるファイルのアドレス], [移動先フォルダ])
第一引数には移動させるファイルのアドレスを指定します。
第二引数には移動先のフォルダのアドレスを指定します。
shutilの使い方は後日記事を追加します。
指定フォルダ内の全ファイルをまとめて移動させる
指定したフォルダのファイルをまとめて移動させるPythonのコードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import os import glob import shutil #移動元のフォルダのアドレス input_folder_path = r"C:\Users\・・・\移動元" #移動先のフォルダのアドレス output_folder_path = r"C:\Users\・・・\移動先" #移動元のフォルダに移り、カレントディレクトリを変更 os.chdir(input_folder_path) #移動元のフォルダにある全ファイルの、アドレスを含むファイル名を変数file_listに代入 file_list = glob.glob(folder_path + "\\" + "*") #file_listにある全ファイルを順番に移動先のフォルダに移動させる for file in file_list: shutil.move(file, output_folder_path) |
上記のコードは以下の流れで動いています。
最初にライブラリをインポートしています。
“input_folder_path”と”output_folder_path”で移動元と移動先のフォルダのアドレスを変数に代入しています。
“os.chdir()”で移動元のフォルダに移動し、カレントディレクトリを変更しています。
※カレントディレクトリについては後述の内容をご覧ください。
“file_list = glob.glob(“*”)”でカレントディレクトリの全ファイル名を取得しています。
最後に、for文内のコードでファイルを全て別のフォルダに移動させています。
“shutil.move(file, output_folder_path)”が実際にファイルを移動させる部分です。
上記のコードを実行すると、移動元のフォルダにあった全ファイルが、
移動先のフォルダに全て移動されていることが確認できます。
誰かが開いているフォルダを除いた全ファイルを移動させる
共有フォルダで起こりがちな現象として、他の誰かがファイルを開いているために、全ファイルを移動させようとしてもできないことです。途中でエラーが発生してしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import os import glob import shutil #移動元のフォルダのアドレスを変数に代入 input_folder_path = r"C:\Users\・・・\移動元" #移動先のフォルダのアドレスを変数に代入 output_folder_path = r"C:\Users\・・・\移動先" #移動元のフォルダに移り、カレントディレクトリを変更 os.chdir(input_folder_path) #先頭に" ~ "と" $ "のどちらかつくファイル以外を全て選択 file_list = glob.glob("[!~$]*") #file_listにある全ファイルを順に処理する for file in file_list: #try文でファイルが開かれているか確認する。 #開かれている場合は無視し、開かれていない場合はファイルを移動させる。 try: #追記モードでファイルを開く f = open(file, "a") #ファイルが開かれている場合、PermissionErrorが発生するのでその場合の処理を指定 except PermissionError: #passにより、今回のループでは何もしないことを指示 #つまり、PermissionError発生時は誰かがファイルを開いているので無視する pass #PermissionErrorが発生しない、つまりファイルが開かれていない場合 else: #先ほど追記モードで開いたファイルを閉じる f.close() #output_folder_pathで指定したフォルダに、fileに保持されたファイルを移動させる shutil.move(file, output_folder_path) |
上記のコードは以下の流れで処理されます。
ライブラリのインポート、移動元と移動先フォルダのアドレスの指定までは同じです。
変数file_listにファイル名を取得する部分は少し異なります。
“file_list = glob.glob([“!~$”]*)”
これは、特殊文字を使ったglobモジュールによって、先頭に「~」または「$」が付くファイルを除いた全ファイルを取得しています。
誰かがファイルを開いていると、隠しファイルで「~$ファイル名」といった一時ファイルが作成されます。これはファイルが閉じられるまで存在します。
これを除いた全ファイルを取得しないと、後でファイルを移動させるときにエラーの原因となってしまいます。
詳しくは以下の記事をご覧ください。
globの使い方。指定したフォルダ内のファイル名一覧を取得する
次に、for文で変数file_listに保持された各ファイルについて順番に処理を行います。
tryを使ってそれぞれのファイルが開かれている場合と開かれていない場合に応じて処理を分けます。
tryは例外処理を行う時に使われます。例外処理とはいわゆるエラーが発生した場合に特別な処理を行うことです。今回はファイルが開かれている場合はエラーが発生することを利用します。
※tryと例外処理については後日記事を追加します。
まず、for文での各ループの最初に、”f=open.(file, “a”)”とすることで、追記モードでファイルを開きます。
もし、他の誰かがファイルを開いている場合は、この時にPermissionErrorというエラーが発生します。
ファイルが開かれている場合、PermissionErrorが発生するので、この場合はpassを使ってそのループではでは何もしないことを指示しています。
一方で、ファイルが開かれていない場合はPermissionErrorは発生しないので、shutil.moveでそのファイルを移動先のフォルダへ移動させます。
カレントディレクトリについて
カレントディレクトリとは、現在の作業ディレクトリです。
コマンドプロンプトでPythonと入力して実行するとPythonが起動しますが、
この時にいる場所がカレントディレクトリになります。
例えば、コマンドプロンプトでデスクトップにいるときは以下のようになります。
C:\Users\[ユーザー名]\Desktop>
カレントディレクトリはデスクトップになっています。
この状態でPyhhonを起動するといつもの対話モードでの実行環境になります。
C:\Users\[ユーザー名]\Desktop>Python>>>
まとめ
今回は、指定フォルダ内の全ファイルを別のフォルダにまとめて移動させる方法についてまとめました。
コメント