📝

Pythonのglob・osを用いた拡張子ごとのフォルダ振り分け

2023/08/25に公開
1

この記事はQiitaの記事の転載です!!

元記事はこちら

https://qiita.com/blueman/items/94054906f377afbe910b


目次

はじめに
作成した経緯
実行環境
正規表現を用いてフォルダにアクセスする方法
拡張子ありのファイル名の取得方法
ファイル名から拡張子を取得する方法
プログラムデータと結果・素材データの識別方法
フォルダの作成方法
フォルダごとにデータを振り分ける方法
ソースコード
結果
まとめ

はじめに

今回は、前回の記事で振り分けたフォルダの中のデータを拡張子から「結果・素材」フォルダと「ソースコード」フォルダにデータを振り分けるプログラムを紹介したいと思います。


よろしければこちらもどうぞ!!

マイページについて

https://qiita.com/blueman


X(Twitter)について

https://twitter.com/0ca00118726208m


Qiitaについて

作成した経緯

前回の記事では大雑把に日付ごとで振り分けていたのですが、これだとフォルダの中のデータが多いとプログラムデータと結果・素材データが分かりにくいという問題が発生しました。
また、GitHubのディレクトリの構造上、プログラムデータと結果・素材データを振り分けることでローカルにあるデータをGitHub上に送りやすくできるようにしました。

実行環境

実行環境は次の通りです。

実行環境
  • 環境
    • Windows10
    • Python 3.10.5

処理内容モジュール・ライブラリの対応を分かりやすく表にすると次の通りです。

説明
処理内容 モジュール・ライブラリ
ファイル名の取得
ファイルの拡張子名の取得
フォルダの作成
ファイルの移動
os
正規表現を用いてフォルダにアクセス glob

正規表現を用いてフォルダにアクセスする方法

こちらのソース

https://note.nkmk.me/python-glob-usage/#0

を見ると、Pythonglob というモジュールを使うことでワイルドカードを使ってフォルダを指定できるそうです。

このモジュールを使ってフォルダの中にアクセスしました。

拡張子ありのファイル名の取得方法

正規表現を用いてフォルダにアクセスする方法でフォルダの中にアクセスできたので、次に拡張子ありのファイル名をこちらのソース

https://note.nkmk.me/python-os-basename-dirname-split-splitext/#_1

にある os.path.basename() を使って取得しました。

ファイル名から拡張子を取得する方法

拡張子ありのファイル名の取得方法で拡張子付きのファイル名を取得できたので次にファイル名から拡張子のみを取り出す方法を調べました。
こちらのソース

https://aiacademy.jp/media/?p=1591

にある os.path.splitext() で拡張子を取得できることが分かりました。
このメソッドを使って、拡張子付きのファイル名から拡張子のみを取り出しました。

プログラムデータと結果・素材データの識別方法

ファイル名から拡張子を取得する方法でファイルから拡張子を取得できました。
現状、使っているプログラミング言語Pythonのみなので Pythonのプログラムの拡張子である .py がファイルの拡張子かどうかプログラムデータとそうではないデータの識別条件としました。
また、フォルダを見ると拡張子が .JPG.jpg.png.mp4 のデータが結果・素材データだったのでこれらの拡張子がファイルの拡張子かどうか結果・素材データとそうではないデータの識別条件としました。

フォルダの作成方法

前回の記事の最終更新月日のフォルダの作成方法をもとに「結果・素材」フォルダと「ソースコード」フォルダを作成しました。

フォルダごとにデータを振り分ける方法

前回の記事の最終更新月日ごとでフォルダに振り分ける方法をもとにプログラムデータと結果・素材データの識別方法から識別したデータをフォルダの作成方法で作成したフォルダに移動させました。

ソースコード

下にソースコードを示します。おそらく実行環境で示した環境では動くはず。

ソースコード
data_separate(ext).py
import glob                                                                                 #正規表現を用いてフォルダにアクセスするためにインポート
import os                                                                                   #ファイル名の取得・ファイルの拡張子名の取得・フォルダの作成・ファイルの移動のためにインポート

path_list=glob.glob('./python/*_*/*')                                                       #正規表現を用いて各フォルダにアクセス(「文字の真ん中に_がある」フォルダにアクセス)

for i in path_list:                                                                         #それぞれの「文字の真ん中に_がある」フォルダについて処理を実行
	file = os.path.basename(i)                                                              #フォルダ内の拡張子ありのファイル名を取得
	name = os.path.splitext(file)                                                           #ファイル名の.について文字を分割(これで拡張子を取得)

	if name[1] == ".JPG" or name[1] == ".jpg" or name[1] == ".png" or name[1]==".mp4":      #拡張子が「.JPG」、「.jpg」、「.png」、「.mp4」の場合に処理を実行
	                                                                                        #(画像ファイルか動画ファイルの場合)
		os.makedirs(os.path.dirname(i)+"/結果・素材",exist_ok=True)                         #拡張子が「.JPG」、「.jpg」、「.png」、「.mp4」であるファイルがあるフォルダ内に
		                                                                                    #「結果・素材」フォルダを(ない場合に)作成
		if(os.path.isfile(i)):                                                              #「文字の真ん中に_がある」フォルダの直下に拡張子が「.JPG」、「.jpg」、「.png」、「.mp4」
	                                                                                        #であるファイルがある場合に処理を実行
			os.rename(i,os.path.dirname(i)+"/結果・素材/"+file)                             #「文字の真ん中に_がある」フォルダの直下にある拡張子が「.JPG」、「.jpg」、「.png」、「.mp4」
			                                                                                #であるファイルを「結果・素材」フォルダ内に移動

	if name[1] == ".py":                                                                    #拡張子が「.py」の場合に処理を実行
		os.makedirs(os.path.dirname(i)+"/ソースコード",exist_ok=True)                       #拡張子が「.py」であるファイルがあるフォルダ内に「ソースコード」フォルダを(ない場合に)作成
		if(os.path.isfile(i)):                                                              #「文字の真ん中に_がある」フォルダの直下に拡張子が「.py」であるファイルがある場合に処理を実行
			os.rename(i,os.path.dirname(i)+"/ソースコード/"+file)                           #「文字の真ん中に_がある」フォルダの直下にある拡張子が「.py」であるファイルを「ソースコード」
			                                                                                #フォルダ内に移動

結果

下に結果を示します。

元のフォルダ内

元のフォルダ内.JPG
元のフォルダ内


元のフォルダ内はプログラムデータと素材・結果データが混在していて分かりにくくなっています。

こちらが処理実行後の同フォルダ内です。

処理実行後のフォルダ内

処理実行後のフォルダ内.JPG
処理実行後のフォルダ内


きちんと 「ソースコード」フォルダと「結果・素材」フォルダで振り分けられています。

それぞれのフォルダ内は次の通りです。

「ソースコード」フォルダ内

「ソースコード」フォルダ内.JPG
「ソースコード」フォルダ内


「結果・素材」フォルダ内

変換後_フォルダ_3.JPG
「結果・素材」フォルダ内


きちんと拡張子ごとに振り分けられています。

まとめ

今回は、前回の記事のデータを拡張子ごとに振り分けることを行いました。
この記事が実際に役に立つかどうかは分かりませんが、誰かの役に立ってくれると嬉しいです。
記事を執筆する余力があれば、次回も記事を投稿する予定です。
次回の予定としては、Twitter(X)のアンケートでトップだった動画像処理から画像の画素ごとの補色で色変換を行いその結果とネガポジ反転から得られた結果とオリジナル画像を並べて表示させ補色による色変換とネガポジ反転の画素値によるヒストグラムを表示させるプログラムを作成できたのでそれに関する記事を投稿予定です。

Discussion