こんにちは!ファンリピートの加藤です。
今回はPythonを利用して整理されていないフォルダを整理する方法について提案させていただければと思います。
命名規則が決まっている場合と拡張子ごとに分ける方法と2つあるのでご自分のデータに合わせて利用してみてください!
Pyhonとは
概要
Pythonは、読みやすく簡潔なコードを特徴とする汎用プログラム言語です。この言語は初心者からプロフェッショナルまでの広範な開発者に支持されており、明確でシンプルな構文を持つことで知られています。
何がすごいのか?
多様なアプリケーションの開発
Pythonは、ウェブ開発、データ分析、人工知能、機械学習といった多くの分野で優れたパフォーマンスを発揮します。
豊富なライブラリとフレームワーク
Pythonの広範なライブラリとフレームワークは、開発者が時間を節約し、コードの品質を向上させることを可能にします。
私のPC環境
OS:Windows11
環境:Anaconda3(Python)
命名規則
さすがに命名規則がしっかりしていないファイルの細かい分割・分類はできません。拡張子(pngやtxtなど)ごとに分けるくらいしかできないので、その際は諦めてください。(テキストデータなのか画像なのか位は分けられます。)
ファイルに命名規則がある前提で以下の話を進めていきます。私が大学の研究などで大量にデータを扱う際の命名規則は以下のようにしています。
yyyymmdd0000_[ファイルのタイトル].[拡張子]
です。
*0000は時間を示しています。(例:17:06にファイルを作成したらここが1706になる。)
分単位で実行するようなものであれば同一ファイル名になることはありません。しかし、今回はお仕事を想定して以下のような命名規則とすることにします。
yyymmdd_[ファイルの作成者]_[ファイルのタイトル].[拡張子]
(例:20200101_山田花子_山田商事議事録.txt)
これぐらいの粒度であれば一目見てわかる内容かとおもいます。では以下よりこれで進めていきます。
実装していく!
早速、コードを書いていきます!
用意するライブラリ
今回利用するライブラリは
- os (Operating System Interface)
- os モジュールは、オペレーティングシステムと対話するためのインターフェースを提供します。
- ファイルやディレクトリを作成、削除、変更する機能や、プロセスを制御するための機能を提供します。
- 環境変数にアクセスしたり、システムコマンドを実行することも可能です。
- 例えば、os.mkdir() でディレクトリを作成し、os.environ で環境変数にアクセスできます。
- shutil (High-level File Operations)
- shutil モジュールは、高レベルのファイル操作を提供し、ファイルおよびディレクトリのコピー、移動、削除などが行えます。
- shutil.copy(), shutil.move(), shutil.rmtree() などの関数を使用して、ファイルやディレクトリの操作を行います。
- これにより、ファイルシステムを操作する作業をより簡単に、効率的に行えます。
です。
どのフォルダ内のデータを整理したいのか?
まず整理したいフォルダを指定しなくてはいけません。そのためにはパスといってPC上のどこにフォルダがあるかを表す住所のようなものがあります。これには「絶対パス」と「相対パス」というものがあります。
「絶対パス」とはディレクトリ構造の頂点から省略せずにすべて記述するもので、「相対パス」は現在作業しているファイルを起点にして目的のファイルまでの経路を記述したものです。
Webサイトを構築するときなどはその使い分けによって負担や手間が変わってきますが、今回は絶対パスをしてします。
#整理したいフォルダのパスを指定
base_directory = 'C:\\Users\\YourUserName\\...\\ファンリピート\\example'
各ディレクトリを区切っている\\ですが、\のみだとエラーを吐くことがあると思います。なぜなら、\nや\dなどと混同するからですね。
ファイル名から分類
フォルダ内からファイル名を取得しなくては分類もできません。以下を参照してください。
#フォルダ内のファイル名を取得
filenames = os.listdir(base_directory)
次にファイル名から特定の識別子を抽出します。その後、グループ分けのための辞書の初期化を行います。
grouped_files = {}
今回の命名規則は
yyymmdd_[ファイルの作成者]_[ファイルのタイトル].[拡張子]
ですが、どこを区切っても分類ができてしまいますが「ファイルのタイトル」で分類することとします。
for filename in filenames:
parts = filename.split('_')
if len(parts) < 3:
print(f'Skipping file with unexpected format: {filename}')
continue
title = parts[2].split('.')[0]
そこで各ファイル名を_(アンダースコア)で分割してタイトルを抽出します。この時分割した部分が3つより少ない場合は無視するようにしています。
分割したものの3つ目(Pythonでは数を0,1,2…と数えるからparts[2]となる)をタイトルとしてそれをもとに先ほど作成した辞書にファイル名を追加していきます。
for title, files in grouped_files.items():
title_folder = os.path.join(base_directory, title)
if not os.path.exists(title_folder):
os.mkdir(title_folder)
for file in files:
src_path = os.path.join(base_directory, file)
dst_path = os.path.join(title_folder, file)
shutil.move(src_path, dst_path)
その後、最初に指定したパスと取得した情報からディレクトリの作成とファイルの移動を行います。それぞれ存在するファイルの数だけ行うようにしています。
print("Grouping complete!")
ここは必要ないかもしれませんが、実行が完了したという旨の表示をさせてあげます。
試してみる!
それではダミーデータをいくつか用意したので実行してみます。ダミーデータの作り方は以下に乗せておくので参照されてください。
以下のフォルダ上に実行すると
このように規則通りに分類されていますね!
おまけ
利用したダミーデータ作成スクリプトも共有するので、自分の環境で実行して動作を確認してみてください。
import os
# フォルダのパスを指定
base_directory = 'C:\\Users\\YourUserName\\...\\ファンリピート\\example'
# ファイルの作成者、タイトル、および拡張子のリスト
creators = ['Alice', 'Bob', 'Charlie']
titles = ['Report', 'Analysis', 'Summary']
extension = 'txt'
# 各作成者、タイトル、および日付の組み合わせに対してファイルを作成
for date in range(210101, 210105): # 日付をyyymmdd形式で210101から210104までと仮定
for creator in creators:
for title in titles:
# ファイル名を作成
filename = f'{date}_{creator}_{title}.{extension}'
# ファイルのフルパスを作成
file_path = os.path.join(base_directory, filename)
# 空のファイルを作成
with open(file_path, 'w') as file:
pass # ファイルは空のままです
print("Dummy files created!")
まとめ
以上、「Pythonでファイル名からフォルダの分類を行う」についてでした。
簡単なコードですが、身近にPythonの便利さを感じれたかと思います。結局はこれらのコードの組み合わせで書かれているので、問題を分解しつつ実装に取り組んでみてください。
読んでいただきありがとうございました!
メンバーを募集中!
当社ではお客様に向き合い、お客様の事業成功にコミットをできる仲間を募集しています。
正社員、インターンから副業まで、幅広く採用活動を進めております。プロジェクトマネージャーやシステムエンジニアとして当社のシステム開発業務に携わってみませんか?
当社と共に、業界トップを目指して挑戦したい方は未経験者から経験者まで広く募集しているので、ぜひエントリーをお待ちしています。