見出し画像

【ファイル操作】重複ファイル検出・整理ツール サンプルコード

・業務効率化には何すればいいのかな?
・Pythonで自動化ツールを作成できると聞くけど、具体的に何が作れるの?
・自動化のアイデアが出てこない

こんな悩みを抱えている人に向けて、Pythonで作れる自動化ツールを解説しています。

ファイル操作のツールについて、こちらの記事で紹介しています。
 ⇒【ファイル操作】Pythonで作れる自動化ツールの具体例アイデア9選【業務効率化】

本記事では、重複ファイル検出・整理ツールのサンプルコードを公開しています。

サンプルコードは、自分で作成するのが難しい方や、ツール作成の手間を減らしたい方にお勧めです。ぜひご活用ください。



アイデア「重複ファイル検出・整理ツール」

概要

指定したディレクトリ内で重複しているファイルを検出し、整理します。

導入メリット

ディスクスペースの無駄遣いを防ぎ、ファイル管理を効率化します。

ツール機能

ファイルのハッシュ値を計算し、同一のハッシュ値を持つファイルを重複として検出。ユーザーが重複ファイルを削除、移動、または保持するかを選択できます。

必要技術

hashlib:ファイルのハッシュ値を計算する

os、shutil:ファイル操作(検索、削除、移動)に使用

処理フロー

  1. ユーザーが検出対象のディレクトリを指定

  2. 指定ディレクトリ内のファイルリストを取得

  3. 各ファイルのハッシュ値を計算

  4. ハッシュ値が同一のファイルを重複として検出

  5. 重複ファイルのリストをユーザーに提示

  6. ユーザーの選択に基づき、重複ファイルを削除、移動、または保持


注意事項

著作権について

本ソースコードの著作権は、販売者に帰属します。
修正や改変は自由に行えますが、無断での複製、配布は法律で禁止されています。

ライセンスについて

本ソースコードは、個人利用及び商用利用が可能です。ただし、再販売や、本ソースコードを基にした派生作品の販売は禁止します。

返金について

デジタルコンテンツの性質上、購入後の返品や返金は原則として受け付けておりません。

使用上の免責事項

本ソースコードは予告なく変更や修正を行う場合があります。
本ソースコードの動作を保証するものではありません。
本ソースコードの使用から生じたいかなる直接的または間接的な損害に対しても、販売者は責任を負いません。
動作の不具合については、購入者自身の責任で対処してください。

サポートについて

本ソースコードに関するサポートは行っておりません。バグ報告や質問への対応は致しかねます。


ソースコード

import os
import hashlib
import shutil

def get_file_hash(file_path):
    """ファイルのハッシュ値を計算"""
    hash_func = hashlib.md5()
    with open(file_path, 'rb') as f:
        while chunk := f.read(8192):
            hash_func.update(chunk)
    return hash_func.hexdigest()

def find_duplicates(directory):
    """指定されたディレクトリ内の重複ファイルを検出"""
    files_hashes = {}
    for root, _, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            file_hash = get_file_hash(file_path)
            if file_hash in files_hashes:
                files_hashes[file_hash].append(file_path)
            else:
                files_hashes[file_hash] = [file_path]
    duplicates = {hash_value: paths for hash_value, paths in files_hashes.items() if len(paths) > 1}
    return duplicates

def handle_duplicates(duplicates):
    """重複ファイルのリストをユーザーに提示し、処理を行う"""
    for file_hash, file_paths in duplicates.items():
        print(f"\n重複ファイル (ハッシュ: {file_hash}):")
        for i, file_path in enumerate(file_paths):
            print(f"{i + 1}. {file_path}")
        
        action = input("ファイルをどうしますか? (削除: d, 移動: m, 保持: k): ").lower()
        if action == 'd':
            for file_path in file_paths[1:]:
                os.remove(file_path)
                print(f"{file_path} を削除しました。")
        elif action == 'm':
            move_to = input("ファイルを移動するディレクトリを指定してください: ")
            os.makedirs(move_to, exist_ok=True)
            for file_path in file_paths[1:]:
                shutil.move(file_path, os.path.join(move_to, os.path.basename(file_path)))
                print(f"{file_path}{move_to} に移動しました。")
        else:
            print("ファイルを保持します。")

def main():
    directory = input("検出対象のディレクトリを指定してください: ")
    duplicates = find_duplicates(directory)
    if duplicates:
        handle_duplicates(duplicates)
    else:
        print("重複ファイルは見つかりませんでした。")

if __name__ == "__main__":
    main()

最後まで読んでいただき、ありがとうございました!
参考のなったと思っていただけたら、
♡スキを押していただけると嬉しいです。

今後もサンプルコードを紹介する予定なので、
関心のある方は是非アカウントのフォローをお願いします!

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