【第27回PYTHON講座】特定のファイルだけ移動させる

スポンサーリンク
PYTHON

今回は、PYTHONを使って、あるフォルダーにある特定のファイルを他のフォルダーに移動させるプログラムを作成してみたいと思います。

スポンサーリンク

プログラム作成に至った理由

ブログのタイトル画像を作成する時はGIMPという描画ソフトを使っています。そして作成したら、画像をPNGやJPGで出力しています。

ファイルを整理するために、GIMP用のファイル(拡張子xcf)と出力した画像ファイル(PNG、JPG)を、GIMP用、画像用と別々のフォルダに分けて保存していますが、時々、画像用のフォルダにGIMPのファイルを間違って保存してしまうことがあります。

定期的に、画像用のフォルダに間違って保存したGIMPのファイルをGIMP用フォルダに、カットアンドペーストをしていましたが、プログラムで作成した方が、正確で楽だと思い、今回のプログラムを作成することに至りました。

プログラムの内容

今回作成するプログラムは以下になります。

『フォルダーA』に拡張子(txt)と拡張子(jpg)のファイルがあるとします。そして、拡張子(jpg)のファイルだけを、『フォルダB』に移動させるプログラムを作成します。

ライブラリについて『os』、『pathlib』、『shutil』

使用するライブラリは、『os』、『pathlib』、『shutil』の3つになります。

os』は、フォルダ内のファイルの有無を調べる為にに使用します。

pathlib』は、ファイルの更新日時を調べる為に使用します。

shutil』は、ファイルを移動する時に使用します。

これらは標準でインストールライブラリになります。

プログラム

import os
import shutil
import pathlib


folder_a = 'C:/Labo/a/' #このフォルダにTXTファイル、JPGファイルが保存されている 
folder_b = 'C:/Labo/b/' #このフォルダにJPGファイルを移動する

#フォルダ内のファイルをリスト化する
list1 = os.listdir(folder_a) 
list2 = [f for f in list1 if os.path.isfile(os.path.join(folder_a, f))]
#JPGファイルだけをリスト化する
list_jpg= [s for s in list2 if ((".JPG") in s) or ((".jpg") in s)]

#移動、コピー処理されたかを知る為のシグナル
processsignal = 0


for i in range(len(list_jpg)):
    file_a = os.path.join(folder_a, list_jpg[i])
    file_b = os.path.join(folder_b, list_jpg[i])

#移動先に同じファイルがあるかを確認する。
    if os.path.isfile(file_b): 
        time_a = pathlib.Path(file_a).stat().st_mtime
        time_b = pathlib.Path(file_b).stat().st_mtime


        if(time_a > time_b):
             shutil.copyfile(file_a,file_b)
             print(list_jpg[i] +"が上書きされました")
             processsignal = 1
#移動先にファイルがなければ、そのまま移動する
    else:
        print("else")
        shutil.move(file_a, folder_b)
        print(list_jpg[i] +"がコピーされました")
        processsignal = 1

#処理が行われない場合もコメントする
if(processsignal == 0):
    print("コピー、更新するファイルはありませんでした")

1、2、3行目:ライブラリを宣言します。

6、7行目:参照するフォルダ、移動先のフォルダを宣言します。

10、11行目:参照するフォルダ内のファイルをチェックします。

os.listdirは、フォルダ内のファイルおよびフォルダをリスト化します。

ファイルだけを取り出したいので、os.path.isfileを使います。os.path.isfileは、ファイルの存在をチェックします。なので、フォルダの場合、os.path.isfileで弾かれることになります。引数は、ファイル名だけではなく、ファイルのパスを含めたファイル名になるので、os.path.joinを使って、ファイルパスを含めたファイル名を作成します。

13行目:JPGファイルは、一般的に、拡張子が『jpg』もしくは『JPG』の2つが存在する為、この2つの文字列のどちらかが含まれていないかをチェックします。

16行目:処理がされなかった時を知る為のシグナルです。

24から26行目:移動先に同じ名前のファイルが無いかをチェックします。もし、同じ名前のファイルが存在したら、更新日時をチェックしどちらが新しいかを調べます。

ファイルの更新日時を調べたい時は、pathlib.Path(パスを含めたファイル名).stat().st_mtimeを使います。このまま出力すると、数値として表示されます。日時が新しい方が、数値が大きくなります。

30、36行目:ファイルをコピーする時は、shutil.copyfile(元ファイル、移動先ファイル)を使い、ファイルを移動する時は、shutil.move(ファイル名、移動先のフォルダ)を使います。

os.path.joinの理由

パスを含めたファイル名を作る場合、文字列の結合、プラスを使って表現しても可能ですが、基本は、os.path.joinを使います。

フォルダを区切る時に、\円マークや/スラッシュなどわからない場合、この関数使えば、気にせずに処理してくれます。ただ、今回のプログラムでは、フォルダを全パスで指定しているので、文字列の結合でも大丈夫です。

まとめ

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

JPGファイルの移動を拡張子の判別で移動させるプログラムです。実際は、ファイル名全体をみているので、ファイル名自体に規則性があるものならば、それらのファイルの抽出も出来ます。

『プログラム作成に至った理由』をご覧いただけたら、おそらく同じようなことをされたいと思われる方が多いのではないでしょうか。フォルダでファイル種類のソートで、カットアンドペーストするのもいいですが、このようにプログラムで動かすと、間違いなく出来ますし、楽しいですよね。

是非、みなさんも色々と応用してくださいね。


コメント

Social Media Auto Publish Powered By : XYZScripts.com
タイトルとURLをコピーしました