見出し画像

Python、「重複する内容をカット」する。

  • ファイル名の重複をカット(指定したファイルのみ)

import os

def cut_duplicate(filename):
    # ファイル名とパスを分離
    path, file = filename.rsplit('\\', 1) if '\\' in filename else ('', filename)
    
    parts = file.split('_')
    unique_parts = []
    seen = set()

    for part in parts:
        if part not in seen:
            unique_parts.append(part)
            seen.add(part)

    result_filename = '_'.join(unique_parts)
    
    # パスと新しいファイル名を結合
    new_filename = f"{path}\\{result_filename}"

    # ファイル名の変更
    os.rename(filename, new_filename)

    return new_filename

# テスト
filename = "C:\\Users\\ABC_ABC_ABCD_ABC_DFG.pdf"
result = cut_duplicate(filename)
print(result)
  • ファイル名の重複をカット(フォルダ名を指定する場合)

import os

def cut_duplicate(filename):
    # ファイル名とパスを分離
    path, file = filename.rsplit('\\', 1) if '\\' in filename else ('', filename)
    
    # 拡張子を取得
    name, extension = os.path.splitext(file)

    parts = name.split('_')  # 拡張子前の部分を取得

    unique_parts = []
    seen = set()

    for part in parts:
        if part not in seen:
            unique_parts.append(part)
            seen.add(part)

    result_filename = '_'.join(unique_parts) + extension
    
    # パスと新しいファイル名を結合
    new_filename = os.path.join(path, result_filename)

    # ファイル名の変更
    os.rename(filename, new_filename)

    return new_filename

def rename_files_in_folder(folder_path):
    # フォルダ内の全てのファイルとサブフォルダを取得
    for foldername, subfolders, filenames in os.walk(folder_path):
        for filename in filenames:
            file_path = os.path.join(foldername, filename)
            new_file_path = cut_duplicate(file_path)
            print(f"Renamed: {file_path} -> {new_file_path}")

# テスト
folder_path = "C:\\Users\\デスクトップ\\1"  # フォルダのパスを指定してください
rename_files_in_folder(folder_path)

  • ファイル名の重複をカット(ルールを追加)

import os

def cut_duplicate(filename):
    # ファイル名とパスを分離
    path, file = filename.rsplit('\\', 1) if '\\' in filename else ('', filename)
    
    # 拡張子を取得
    name, extension = os.path.splitext(file)

    # 区切り文字を定義
    separators = ['_', '(', '【', '(',')',')','】','[',']']

    # 削除する文字列
    exclude_strings = ['参考資料', 'ブレーキ', '設計', 'チェック', '完了', 'データ']

    for separator in separators:
        name = name.replace(separator, '_')
    
    parts = name.split('_')  # 拡張子前の部分を取得

    unique_parts = []
    seen = set()

    for part in parts:
        if part not in seen:
            # exclude_strings に含まれない場合に追加
            if not any(exclude_string in part for exclude_string in exclude_strings):
                unique_parts.append(part)
            seen.add(part)

    # アンダーバーが2重になっている場合は1つにする
    result_filename = '_'.join(unique_parts).replace('__', '_') + extension
    
    # パスと新しいファイル名を結合
    new_filename = os.path.join(path, result_filename)

    # ファイル名の変更
    os.rename(filename, new_filename)

    return new_filename

def rename_files_in_folder(folder_path):
    # フォルダ内の全てのファイルとサブフォルダを取得
    for foldername, subfolders, filenames in os.walk(folder_path):
        for filename in filenames:
            file_path = os.path.join(foldername, filename)
            new_file_path = cut_duplicate(file_path)
            print(f"Renamed: {file_path} -> {new_file_path}")

# テスト
folder_path = "C:\\Users\"  # フォルダのパスを指定してください
rename_files_in_folder(folder_path)
  • フォルダ名の重複をカット

import os

def cut_duplicate(name):
    # アンダーバー、カッコ、「【」、「(」で分割
    separators = ['_', '(', '【', '(','】_','_【']
    for separator in separators:
        name = name.replace(separator, '_')
    
    parts = name.split('_')  # フォルダ名またはファイル名を分割

    unique_parts = []
    seen = set()

    for part in parts:
        if part not in seen:
            unique_parts.append(part)
            seen.add(part)

    result_name = '_'.join(unique_parts)
    
    return result_name

def rename_files_in_folder(folder_path):
    for foldername, subfolders, filenames in os.walk(folder_path):
        # Rename folders
        for subfolder in subfolders:
            old_folder_path = os.path.join(foldername, subfolder)
            new_folder_name = cut_duplicate(subfolder)
            new_folder_path = os.path.join(foldername, new_folder_name)
            
            if old_folder_path != new_folder_path:
                os.rename(old_folder_path, new_folder_path)
                print(f"Renamed Folder: {old_folder_path} -> {new_folder_path}")
        
        # Rename files
        for filename in filenames:
            old_file_path = os.path.join(foldername, filename)
            new_file_name = cut_duplicate(filename)
            new_file_path = os.path.join(foldername, new_file_name)
            
            if old_file_path != new_file_path:
                os.rename(old_file_path, new_file_path)
                print(f"Renamed File: {old_file_path} -> {new_file_path}")

# テスト
folder_path = "C:\\Users\\デスクトップ\\test2"  # フォルダのパスを指定してください
rename_files_in_folder(folder_path)


重複内容がカットされました。

このコードは、指定されたファイルパスからファイル名を取り出し、アンダースコアで区切られた部分に対して重複する部分を削除して新しいファイル名を作成し、元のファイルをその新しい名前に変更する機能を提供します。

具体的な手順は以下の通りです:

  1. 与えられたファイルパスから、ディレクトリパスとファイル名を取り出します。

  2. ファイル名をアンダースコアで分割し、各部分を処理します。

  3. 各部分について、それがすでに処理されたかどうかを確認し、処理されていない場合は新しいファイル名の一部として採用します。

  4. これらの新しい部分をアンダースコアで結合して新しいファイル名を作成します。

  5. 元のディレクトリパスと新しいファイル名を結合し、新しいファイルのフルパスを作成します。

  6. os.rename を使用して元のファイルを新しい名前に変更します。

  7. 最後に新しいファイルのフルパスを返します。

注意: ファイル名にアンダースコア以外の区切り文字がある場合や、ファイルが存在しない場合には適切な対応が必要です。また、Windowsのパス区切り文字はバックスラッシュ (\) ですが、Linuxなど他のプラットフォームではスラッシュ (/) を使用することが一般的です。このコードはWindows向けに書かれているため、他のプラットフォームでは適切な修正が必要かもしれません。


最後までお読みいただきありがとうございます。
♡頂けますと、励みになります。

いいなと思ったら応援しよう!