見出し画像

【超有益】Pythonでファイル内容に応じて自動的にファイル整理する方法

「どのファイルにあの言葉が入ってたか忘れた…」
「ファイルの内容に応じてフォルダを整理したい!」
「Pythonで自動的に分類できるって聞いたけどどうすればいいの?」

本記事ではこのような方を対象に、Pythonで特定のフォルダ内にあるファイルを内容に応じて自動的に分類する方法をご紹介します。

■本記事で分かること
Pythonで特定のフォルダ内にあるファイルを内容に応じて自動的に分類する方法

■本記事の信頼性
私は、本業でChatGPTなどのAIツールを活用して効率化を実現。ほぼ毎日定時で帰宅し、家族との充実した時間を確保している「なおき」といいます。

AIと全く無縁の体育系で文系出身(数学Ⅱで終わりました)の私でもできる時短術をわかりやすく説明できるよう、Xなどを活用して情報発信しています。

今回は、非エンジニアでもできる「Pythonで特定のフォルダ内にあるファイルの内容に応じて自動的に分類する方法」をご紹介します!

1.Pythonで整理したいフォルダの準備

まずは、ファイル名やファイルの内容がごちゃまぜで整理できていないフォルダと整理先のフォルダを準備してください。

今回は、ダウンロードフォルダの中に「test」フォルダを作り、「Reports」、「Invoices」、「Memos」という名前のファイルを混在させてみました。

ダウンロードフォルダ内に作成したtestフォルダの中身

さらにややこしくするため、テキストドキュメントの「Reports」ファイルの中に「Invoices」という内容を含ませてみました。

txtメモの中身

あわせて、testフォルダ内に各ファイルを分類させるための「移動先フォルダ」を作成しておきましょう。

2.Pythonスクリプトの準備

次に、Pythonスクリプトを準備します。

ファイルの内容に応じて自動的に分類するためには、まずスクリプトを実行するためのライブラリと呼ばれるものをWindows PowerShellやコマンドプロンプトでインストールする必要があります。

ライブラリをインストールするため、デスクトップなどの検索を使用して、Windows PowerShellまたはコマンドプロンプトを起動してください。

Windows PowerShellを起動

Windows PowerShellまたはコマンドプロンプトを起動したら、以下の内容をコピペしてEnterを押してインストールしてください。

pip install PyPDF2
pip install openpyxl
PyPDF2のインストールの記載方法
openpyx1のインストールの記載方法

次に、以下のスクリプトをお使いの実行環境(VScodeなど)にコピペして下さい。

import os
import shutil
from PyPDF2 import PdfReader
from openpyxl import load_workbook

# 分類するファイルがあるディレクトリ
source_directory = 'path/to/your/source/directory'

# 分類先のベースディレクトリ
destination_base = 'path/to/your/destination/directory'

# ファイルの内容に基づく分類関数
def classify_files_by_content(directory):
    for filename in os.listdir(directory):
        file_path = os.path.join(directory, filename)
        
        if os.path.isfile(file_path):
            content = extract_content(file_path)
            
            # 内容に基づいて適切なフォルダを決定
            if 'invoice' in content.lower():
                destination_folder = os.path.join(destination_base, 'Invoices')
            elif 'report' in content.lower():
                destination_folder = os.path.join(destination_base, 'Reports')
            else:
                destination_folder = os.path.join(destination_base, 'Others')
                
            move_file(file_path, destination_folder)

def extract_content(file_path):
    content = ""
    if file_path.endswith('.txt'):
        with open(file_path, 'r', encoding='utf-8') as file:
            content = file.read()
    elif file_path.endswith('.pdf'):
        try:
            reader = PdfReader(file_path)
            for page in reader.pages:
                content += page.extract_text()
        except Exception as e:
            print(f"Error reading {file_path}: {e}")
    elif file_path.endswith('.xlsx'):
        try:
            workbook = load_workbook(file_path)
            sheet = workbook.active
            for row in sheet.iter_rows(values_only=True):
                content += ' '.join([str(cell) for cell in row if cell is not None])
        except Exception as e:
            print(f"Error reading {file_path}: {e}")
    return content

def move_file(file_path, destination_folder):
    if not os.path.exists(destination_folder):
        os.makedirs(destination_folder)
    shutil.move(file_path, destination_folder)
    print(f'Moved: {file_path} -> {destination_folder}')

# スクリプトの実行
if __name__ == '__main__':
    classify_files_by_content(source_directory)

このスクリプトは、指定されたディレクトリ内のファイルの内容(キーワード)を取得し、内容に応じてファイルを分類してくれるものです。

しかも、ファイルの形式は問いません。
ファイルの中に指定した特定のキーワードが含まれていれば容赦なく分類してくれます。

分類後、
「どこ行った!?」とならないように注意してください。(笑)

今回は、以下のようなキーワードを含むファイルがそれぞれ指定のフォルダに分類されるようになっています。

# 内容に基づいて適切なフォルダを決定
if 'invoice' in content.lower():
    destination_folder = os.path.join(destination_base, 'Invoices')
elif 'report' in content.lower():
    destination_folder = os.path.join(destination_base, 'Reports')
else:
    destination_folder = os.path.join(destination_base, 'Others')

ここでは、
「invoice」を含むデータは「Invoices」フォルダへ
「report」を含むデータは「Reports」フォルダへ
そのほかのデータは「Others」フォルダへ移動することになっています。

もちろん、各キーワードはお好みで設定可能です。

また、「Invoices」などの移動先フォルダはキーワードごとに自動で作成されるので、あらかじめフォルダを作成しておく必要はありませんのでご安心ください。

最後に、このままだと、変更したいdocxファイルのあるフォルダパスが指定されていない状態なので、以下の部分を指定のフォルダのパスにしてください。

【変更する箇所】

# 分類するファイルがあるディレクトリ
source_directory = 'path/to/your/source/directory'

# 分類先のベースディレクトリ
destination_base = 'path/to/your/destination/directory'

【変更後】
注意点として、スラッシュを「\\」のように2つにすることを忘れないでください。

# 分類するファイルがあるディレクトリ
source_directory = 'C:\\Users\\・・・・・\\test'

# 分類先のベースディレクトリ(変更が必要な場合はここを編集してください)
destination_base = 'C:\\Users\\・・・・・\\test\\移動先フォルダ'

先ほど設定した「test」フォルダと「移動先フォルダ」をパスに入れました。

ここまで出来たら、あとは実行するだけです!

3.Pythonスクリプトの実行

実行すると、自動で以下のように分類されました!

移動先フォルダに移動したファイルの状況

内容に応じてフォルダが自動的に作成されて分類されていることが分かります。

先ほどファイルの内容にInvoicesと入力したReportsファイルはちゃんと内容に応じて分類されているでしょうか?

個別に開いてみると以下のようになります👇

InvoicesフォルダにReportsファイルが分類された状況
Othersファイルの中の状況

ちゃんと内容に応じて分類されていることが確認できましたね!

以上で、作業は終了です。
お疲れ様でした!!

4.まとめ

今回は、「Pythonで特定のフォルダ内にあるファイルを内容に応じて自動的に分類する方法」をテーマに紹介しましたが、いかがだったでしょうか?

  1. 分類したいファイルと分類先のフォルダの準備

  2. 必要なライブラリのインストール

  3. Pythonスクリプトの設定とキーワード等の入力

  4. Pythonスクリプトの実行

上記の内容が実行できれば、ワンクリックで特定のフォルダ内にあるファイルを内容に応じて自動的に分類できるようになります!

ファイルの中身を特定のキーワードで分類している方はファイルの内容をいちいち調べることなく、一発で分類できるようになりますので、かなり時短になるのではないでしょうか?

また、分類先のフォルダも自動で作成されるため、フォルダをいちいち作成する手間も省くことができます!

さらに…

  • ファイルの種類

  • ファイルの名前

  • ファイルの作成日

  • ファイルのサイズ

上記のような分類もPythonで自動的にできるので是非使ってみて下さい👇

みなさんの業務が少しでも効率化できれば、スキ、SNSでの紹介をしていただけると大変励みになりますので、何卒よろしくお願いします!

このほか、AI×時短術の知識をX(旧Twitter)で紹介していますので、是非フォローしてください!


この記事が気に入ったらサポートをしてみませんか?