Python 再帰的にフォルダを探索し、ファイルを整理する

本記事では、例えば下図のように、dirJpgフォルダ内に「1,2,3…」のフォルダがあり、それぞれの中に「picture_A‗数字.jpg」といった名のファイルがある。

dirJpg
├─1
│ │ picture_A_1.jpg
│ │ picture_B_1.jpg
│ │ picture_C_1.jpg
│ │ …

├─2
│ │ picture_A_2.jpg
│ │ picture_B_2.jpg
│ │ picture_C_2.jpg
│ │ …

├─3
│ │ picture_A_3.jpg
│ │ picture_B_3.jpg
│ │ picture_C_3.jpg
│ │ …

上記のファイル構成から、下図のような「new_dirJpg」フォルダを作成して、更に「picture_A」…といった名のフォルダを作成し、それぞれに同名のファイルをコピーしてゆく仕様のコードである。

new_dirJpg
├─picture_A
│ │ picture_A_1.jpg
│ │ picture_A_2.jpg
│ │ picture_A_3.jpg
│ │ …

├─picture_B
│ │ picture_B_1.jpg
│ │ picture_B_2.jpg
│ │ picture_B_3.jpg
│ │ …

├─picture_C
│ │ picture_C_1.jpg
│ │ picture_C_2.jpg
│ │ picture_C_3.jpg
│ │ …

■本プログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import shutil

def main():
    ### make dirctories
    os.mkdir(new_dir_name)
    copied_dir_list = []
    for dir_name in target_list:
        new_dir_path = os.path.join(new_dir_name, dir_name)
        os.mkdir(new_dir_path)
        copied_dir_list.append(dir_name)
    
    ### search file and copy file
    for dirpath, dirnames, fnames in os.walk(target_path):
        for fname in fnames:
            for target_file in copied_dir_list:
                if target_file in fname:
                    target_file_path = os.path.join(dirpath, fname)
                    new_path_list = [new_dir_name, target_file, fname]
                    copy_file_path = os.path.join(*new_path_list)
                    print(target_file_path)
                    shutil.copy2(target_file_path, copy_file_path)

if __name__ == '__main__':
    ### parameter
    target_path = "./dirJpg/"
    target_list = ['picture_A', 'picture_B', 'picture_C']
    new_dir_name = "./new_dirJpg/"
    
    ### call function
    main()

すると、例えば下記リンク先のようにフォルダ別に画像を整頓できる。

hk29.hatenablog.jp

以上

<広告>