一括でファイルを移動する 【Python】

programming Python

移動したいファイルとフォルダの場所をテキストファイルに書き出しておくと、ファイルの移動を一括で行う Python のスクリプトをまとめておきます。

以下の環境で動作確認をしています。
環境: Windows 10、Python 3.X

背景: 扱うファイルが多すぎる!

グーグルやネット銀行、証券などのサイトでファイルをダウンロードしたとき、ファイル名に応じて、各サービス、銀行・証券用に作ったフォルダに自動でファイルを振り分けたいことがあります。
たいていのウェブサービスでは、ファイルのダウンロードは1クリックでできるため、その後のファイルの振り分けも、1アクション(バッチファイルのダブルクリック1回)で行いたいところです。

そこで、設定用のテキストファイルに、移動元のフォルダ、ファイル名のパターン、移動先のフォルダ、を書き出しておき、Python のスクリプトを実行すると、該当するファイルを一括で移動するスクリプトを作成しました。

なお、実際に使う場合は、ファイルの移動が失敗する場合を考えて、事前に実験用のフォルダ間でテストを行って問題のないことを確認したのちに、実際に運用するようにしてください。

設定手順

① 以下を参考に、ファイル移動のための作業用のフォルダを作成してください。
c:\user\file_move1
② 以下を参考に、移動前、移動後の2つのフォルダを作成してください。
c\user\file_move1\folder1
c\user\file_move1\folder2
③ ①のフォルダ内に、file_move1.py 等の名前でテキストファイルを作成し、下記のサンプルコードを貼りつけて保存してください。
④ ①のフォルダ内に、pattern1.txt という名前のテキストファイルを作成し、下記の設定例を貼りつけて保存してください。

使い方: Pythonでファイル移動

⑤ ②の folder1 内に、csv1.csv 等の名前でファイルを保存してください。
⑥ ③の Python スクリプトを実行してください。
→ folder1 から folder2 に、ファイル(csv1.csv)が移動します。

うまく動いたら

ファイル名の設定、フォルダの設定

・ うまく動いたら、pattern1.txt の内容を修正し、実際に使いたいファイルのコピーを folder1 に入れて、うまく移動するか確認をしてください。
・ 移動元、移動先のフォルダについても修正して、実際に使いたいフォルダ間でファイルが移動することを確認してください。
・ ファイルが複数ある場合は、pattern1.txt に複数の行を追加しておくことで指定、実行できます。
・ ファイルの移動元、移動先が複数パターンある場合も、pattern1.txt ファイルで各フォルダを指定できます。

ダウンロードフォルダ、デスクトップ上も一気にファイル移動

・ Windows 10 の Microsoft Edge の場合、ファイルをダウンロードすると、C:\Users\[ユーザ名]\Downloads フォルダにファイルが入ると思います。このフォルダからファイル移動するように pattern1.txt に記載しておくと、1アクションで、ファイルの移動が実行できます。
・ また、デスクトップは、C:\Users\[ユーザ名]\Desktop フォルダに該当します。
このデスクトップからファイル移動するように設定しておけば、デスクトップ上で作成したファイルも、1アクションで移動できます。デスクトップに散らかったファイルや、ダウンロードフォルダに溜まったファイルを一掃することができます。

バッチファイル化&タスクスケジューラ化

・ Python スクリプトの実行をバッチファイル化して、リンクをデスクトップ等に置いておけば、ダブルクリック1回ですべてのファイルの移動が完了します。
・ または、1日1回など、タスクスケジューラからバッチファイルを実行するよう設定しておけば、ダウンロードしたファイル類がすべて所定時刻に自動で片づくよう設定できます。

★ なお、下記のスクリプトでは、安全のため、移動先にすでに同一名のファイルがあった場合は、ファイルの移動をしないように記載しています。
移動先に同一ファイル名のファイルがあったとき、移動元のファイルで上書きを実行して移動させたい場合は、最後の if 文を外すようスクリプトを修正すると、移動させることができます。

まとめ

ファイル名に応じて、ファイルの移動を一括で行う Python のスクリプトをまとめました。

なお、以下の関連リンクで、ファイル名の一括変換(日付つきファイルへの変換)もできるようにしています。
ファイルをダウンロードしたら、日付つきファイル名に変換し、その後、各フォルダにそれぞれ振り分けるなど、ファイル管理が自由自在になります。

もし、日常業務の自動化などに関心があるようでしたら、参考にしてみてください。
定型作業は徹底的に排除してしまいましょう!

関連リンク
・ ファイル名を一括変換する 【Python】

サンプル

“pattern1.txt” ファイルの記載例

c:\user\file_move1\folder1, *.csv, c:\user\file_move1\folder2

★ 逆スラッシュ(1個)は “\” に修正してください。

サンプルスクリプト

import os 
import glob as gb1 
import subprocess 

def read1( file1 ): 
    with open( file1, 'r', encoding='utf-8' ) as f1: 
        str1 = f1.read()
    return str1 

def get_a1( file1 ): 
    a1 = read1( file1 ).strip().split( "\n" ) 
    for i1 in range( len( a1 ) ): 
        a1[i1] = a1[i1].split( ", " ) 
    return a1 

path1 = os.path.dirname(__file__) + "/"  
file0 = path1 + "pattern1.txt" 
a0 = get_a1( file0 ) 

for i1 in range( len( a0 ) ): 
    a1 = a0[i1] 
    if len( a1 ) == 3: 
        pattern1 = a1[0].strip() + "\\" + a1[1].strip()     # pattern 
        path2 = a1[2].strip()                               # destination folder 
        files1 = gb1.glob( pattern1 ) 
        for file1 in files1:                                # all files 
            file2 = os.path.split( file1 )[1]               # file name only 
            file3 = path2 + "\\" + file2                    # destination file 
            if os.path.isfile( file3 ): 
                print( "file exists: " + file3 ) 
            else: 
                cmd1 = 'move "' + file1 + '" "' + path2 + '\\"' 
                print( cmd1 ) 
                ret1 = subprocess.run( cmd1, shell=True ) 

★ 逆スラッシュ2個は、”\\” に修正してください。

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