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

programming Python

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

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

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

グーグルやネット銀行、証券などのサイトでファイルをダウンロードしたとき、ファイル名に応じて、各サービス、銀行・証券用に作ったフォルダに自動でファイルを振り分けたいことがあります。

たいていのウェブサービスでは、ファイルのダウンロードは1クリックでできるため、その後のファイルの振り分けも、1アクション(バッチファイルのダブルクリック1回)で行いたいところです。

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

なお、実際に活用される場合は、事前にテストを行って問題なく機能することを確認してください。

設定手順

① 以下を参考に、ファイル移動のための作業用のフォルダを作成してください。
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 パソコンの場合、ファイルをダウンロードすると、C:\Users\[ユーザ名]\Downloads フォルダにファイルが入ると思います。このフォルダからファイル移動するように pattern1.txt に記載しておくと、1アクションでファイルの移動できます。
・ また、デスクトップは、C:\Users\[ユーザ名]\Desktop フォルダに該当します。
このデスクトップからファイル移動するように設定しておけば、デスクトップ上に散らかしたファイルも、1アクションで移動できます。
デスクトップやダウンロードフォルダに溜まったファイルを一掃することが可能になります。

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

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

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

まとめ

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

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

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

関連リンク
・ 一括で日付つきファイル名に変換する 【Python】
・ ウェブ検索と結果の取得を自動化する【Python & selenium】

サンプル

“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をコピーしました