【Python】データ別にフォルダ分けをするプログラムを実装する

【Python】データ別にフォルダ分けをするプログラムを実装する

こんにちは、しゃねろんです。
今回はデータ別にフォルダ分けをするプログラムを実装したのでそれを記事にしていきます。

今回作成したコードはGitHubに投稿しているので、よければそちらもご覧ください!

https://github.com/Unigmos/FileTidy/blob/main/Ver1.0/FileTidy.py

今回実装したもの

今回のプログラムで実装したものは大きく2つ

  • フォルダの作成
  • 拡張子の確認、フォルダ分け

になります。
それぞれ詳しく説明していきます。

GitHubの方にコードは乗っていますが、一応このページにも載せておきます。
今回用いたコードはこちら↓

import os
import shutil

#フォルダ名指定
dir_name1 = "画像フォルダ"
dir_name2 = "音声フォルダ"
dir_name3 = "映像フォルダ"
dir_name4 = "テキストフォルダ"

#整頓するデータの最低数指定
data_number = 3

if(len(os.listdir()) >= data_number):
    try:
        data_files = os.listdir()

        os.mkdir(dir_name1)
        os.mkdir(dir_name2)
        os.mkdir(dir_name3)
        os.mkdir(dir_name4)
    except FileExistsError:
        print("FileExistsError:すでに同じ名前のフォルダが存在しています")

    dir_name1_path = dir_name1 + "/"
    dir_name2_path = dir_name2 + "/"
    dir_name3_path = dir_name3 + "/"
    dir_name4_path = dir_name4 + "/"

    for files in data_files:
        if(files.endswith(".png") or files.endswith(".jpg") or files.endswith(".bmp")):
            shutil.move(files, dir_name1_path + files)
        elif(files.endswith(".mp3") or files.endswith(".wav")):
            shutil.move(files, dir_name2_path + files)
        elif(files.endswith(".mp4") or files.endswith(".mov")):
            shutil.move(files, dir_name3_path + files)
        elif(files.endswith(".txt") or files.endswith(".csv")):
            shutil.move(files, dir_name4_path + files)
        else:
            pass

else:
    print("整頓するほどのデータが存在しません")

フォルダの作成

まずはフォルダの作成について説明していきます。
コードだと以下の部分に該当します。

import os

#フォルダ名指定
dir_name1 = "画像フォルダ"
dir_name2 = "音声フォルダ"
dir_name3 = "映像フォルダ"
dir_name4 = "テキストフォルダ"

#整頓するデータの最低数指定
data_number = 3

if(len(os.listdir()) >= data_number):
    try:
        os.mkdir(dir_name1)
        os.mkdir(dir_name2)
        os.mkdir(dir_name3)
        os.mkdir(dir_name4)
    except FileExistsError:
        print("FileExistsError:すでに同じ名前のフォルダが存在しています")

else:
    print("整頓するほどのデータが存在しません")

まず os を import します。
os モジュールではフォルダの作成や削除などといったファイルの操作を行うことができるモジュールです。
os は標準ライブラリに入っているので、pip等からインストールする必要はありません。

フォルダ作成の前に最初の if 文ではデータ整頓するにあたって最低数というものを指定しました。データが少なくフォルダを作成しても意味がありませんからね。
len(os.listdir()) にてデータ数をカウントしています。

次に os.mkdir() にてフォルダを作成します。
今回は()の中に dir_name という変数を用意しているので、その変数の名前のフォルダが作成されます。

拡張子の確認、フォルダ分け

次に拡張子の確認、フォルダ分けについて説明していきます。
コードだと以下の部分に該当します。

import shutil

data_files = os.listdir() #tryのすぐ下の行のやつ

dir_name1_path = dir_name1 + "/"
dir_name2_path = dir_name2 + "/"
dir_name3_path = dir_name3 + "/"
dir_name4_path = dir_name4 + "/"

for files in data_files:
    if(files.endswith(".png") or files.endswith(".jpg") or files.endswith(".bmp")):
        shutil.move(files, dir_name1_path + files)
    elif(files.endswith(".mp3") or files.endswith(".wav")):
        shutil.move(files, dir_name2_path + files)
    elif(files.endswith(".mp4") or files.endswith(".mov")):
        shutil.move(files, dir_name3_path + files)
    elif(files.endswith(".txt") or files.endswith(".csv")):
        shutil.move(files, dir_name4_path + files)
    else:
        pass

まず shutil を import します。

shutil も os と同様に標準ライブラリに入っているので、pip等からインストールする必要はありません。

まず、変数 data_files の中に os.listdir() の値を挿入します。
ちなみに os.listdir() で得られる値はデータの配列になります。
※出力例
[‘000.png’, ‘001.mp4’]

あとはfor文で一要素ずつ取り出して各拡張子別に振り分けていく処理になります。
if文では files.endwith() にて()内の文字列と最後の文字列が一致しているかを検出し、同じ文字列のものはファイルを移動するということになります。

実際に一つ目のif文を見ていきましょう。

if(files.endswith(".png") or files.endswith(".jpg") or files.endswith(".bmp")):
    shutil.move(files, dir_name1_path + files)

今回の場合、拡張子が「.png」「.jpg」「.bmp」の時に処理を行います。
つまり画像フォルダのことですね。

if文でどれかしらが当てはまった場合、
shutil.move(files, dir_name1_path + files) を行います。
shutil.move() の第一引数は移動したいファイルのパス、第二引数は移動先のファイルのパスを指定することでファイルの移動を行うことができます。

他のelif文も同様の処理を行い、どれにも当てはまらない場合には pass 、つまり何も処理を行わないようにしています。

まとめ

今回はデータ別にフォルダ分けをするプログラムを実装しました。
拡張子の場所を増やすことによって拡張することもできるのでぜひ試してみてください!

テーマ

現在使用中テーマは最新版

v.1.0v.2.0v.3.0v.3.1v.3.2v.3.3v.3.4v.3.5v.3.6v.3.7v.3.8v.shaneron選択しない(安定版)