python

#.txt(複数)のファイルのBOMの有無を調べ、
#ディレクトリー'bom'(BOM付き)と'clean'(BOMなし)
#に分けて保存する。
#'bom'と'clean'が存在しない場合は作成し、
#存在する場合には、上書き保存するかを確認する。
import os
import shutil

# テキストファイルのBOMの有無を調べる
def has_bom(file_path):
    with open(file_path, 'rb') as f:
        first_bytes = f.read(3)
        return first_bytes == b'\xef\xbb\xbf'

# ファイルを移動する関数
def move_file(source, destination):
    os.rename(source, destination)

# ディレクトリを作成する関数
def create_directory(directory, directory_name):
    if os.path.exists(directory):
        overwrite = input(f"'{directory_name}' already exists. Do you want to overwrite it? (Y/N): ").strip().lower()
        if overwrite != 'y':
            print(f"Skipping '{directory_name}' directory creation.")
            return
        else:
            print(f"'{directory_name}' directory will be overwritten.")
            shutil.rmtree(directory)  # os.rmdir(directory) の代わりに shutil.rmtree(directory) を使用
    os.makedirs(directory)
    print(f"'{directory_name}' directory created.")

# ディレクトリ内のファイルをチェックして処理する
def process_files(directory):
    # 'bom'と'clean'ディレクトリの定義
    bom_dir_name = 'bom'
    clean_dir_name = 'clean'
    bom_dir = os.path.join(os.path.dirname(directory), bom_dir_name)
    clean_dir = os.path.join(os.path.dirname(directory), clean_dir_name)

    create_directory(bom_dir, bom_dir_name)
    create_directory(clean_dir, clean_dir_name)

    for filename in os.listdir(directory):
        if filename.endswith('.txt'):
            file_path = os.path.join(directory, filename)
            if has_bom(file_path):
                new_file_path = os.path.join(bom_dir, f'bom-{filename}')
                move_file(file_path, new_file_path)
                print(f'{filename} contains BOM and moved to {bom_dir_name} directory as bom-{filename}')
            else:
                new_file_path = os.path.join(clean_dir, f'clean-{filename}')
                move_file(file_path, new_file_path)
                print(f'{filename} does not contain BOM and moved to {clean_dir_name} directory as clean-{filename}')

# テスト用のディレクトリパス
directory_path = os.path.abspath('chcode')  # 'chcode' ディレクトリの絶対パスを取得

# ディレクトリ内のファイルを処理する
process_files(directory_path)