ふらふら Diary (仮)

興味のあることを適当に書いていく感じです

Python ファルダ内のファイルを一括処理

はじめに

一つのファイルに対して行う処理のコードは書けたけど、この処理をある特定のファルダ内のファイルすべてに対して行いたいというときに自分がよく使う方法をまとめた。

フォルダ構成

temp
├── dir
└── image0.png
└── image1.png
└── image2.png
├── dir2

一括処理

今回は簡単な画像処理を用いた例を書く。

import cv2
import pathlib

input_dir = './dir'
# 保存するファルダ
output_dir = './dir2'

# フォルダ内に保存されているファイル一覧
image_list = list(pathlib.Path(input_dir).glob('**/*.png'))

for i in range(len(image_list)):
    # 画像一枚をグレースケールで読み込み
    img = cv2.imread(str(image_list[i]), cv2.IMREAD_GRAYSCALE)
    # (100,100)にリサイズ
    img_resize = cv2.resize(img, (100,100))
    # 保存先
    output_path = output_dir + '/' + image_list[i].name
    # 画像保存 
    cv2.imwrite(output_path, img_resize)

以下でinput_dir内の「.png」が使用されるファイルパスのみ取得。

image_list = list(pathlib.Path(input_dir).glob('**/*.png'))

保存するファイル名は読み込んだファイル名と同一にしたいのでimage_list[i].nameとする。拡張子なしのものが欲しいときはimage_list[i].stemとする。

image_list[0] 

dir/image0.png

image_list[0].name 

image0.png

image_list[0].stem 

image0

おわりに

pathlibを用いてフォルダ内のファイルを一括処理する方法を記載した。pathlibは慣れればとても使いやすいものだと思う。