見出し画像

【便利】右クリックツールを作ろう!- Shift-JISをUTF-8に一括変換

概要

今日は、日ごろのちょっとした手作業を減らすツールの紹介をします!
作成したソースファイルにShift-JISのものが混ざってしまっていること、たまにあると思います。
そこで、今まで作ったファイルを一括でUTF-8に変更するスクリプトを作ってみました。

スクリプト

以下の2つのファイルを、同じフォルダに保存してください。
文字コードを変換したいフォルダまたはファイルをbatの方にドラッグ&ドロップすれば、まとめて変換してくれます。
(フォルダの中は、再帰的に探索されて、すべてのファイルが変換されます)

shiftjis_to_utf8.py

import os
import sys
import chardet

def convert_to_utf8(file_paths):
    for file_path in file_paths:
        # パスがディレクトリの場合、再帰的に検索
        if os.path.isdir(file_path):
            for root, dirs, files in os.walk(file_path):
                for file in files:
                    full_path = os.path.join(root, file)
                    process_file(full_path)
        else:
            process_file(file_path)

def process_file(file_path):
    # ファイルの存在を確認
    if not os.path.isfile(file_path):
        print(f"File does not exist: {file_path}")
        return

    # ファイルの内容をバイナリモードで読み込む
    with open(file_path, 'rb') as file:
        raw_data = file.read()

    # 文字コードを推定
    encoding = chardet.detect(raw_data)['encoding']

    if encoding is None:
        print(f"Failed to detect encoding for file: {file_path}")
        return

    # 文字コードがShift-JISならUTF-8に変換
    if encoding.lower() == 'shift_jis' or encoding.lower() == 'shift-jis':
        try:
            # Shift-JISからUTF-8にデコード・エンコード
            decoded_data = raw_data.decode('shift_jis')
            utf8_data = decoded_data.encode('utf-8')

            # 同じファイル名でUTF-8として保存
            with open(file_path, 'wb') as file:
                file.write(utf8_data)
            print(f"Converted {file_path} to UTF-8.")
        except UnicodeDecodeError:
            print(f"Unicode decode error encountered in file: {file_path}")
    else:
        print(f"No conversion needed for file: {file_path} (detected encoding: {encoding})")

if __name__ == '__main__':
    # コマンドライン引数からファイルパスのリストを取得
    if len(sys.argv) > 1:
        file_paths = sys.argv[1:]  # 最初の引数はスクリプト名なので除外
        convert_to_utf8(file_paths)
    else:
        print("No files provided.")

shiftjis_to_utf8.bat

@echo off
setlocal

:: バッチファイルが存在するディレクトリを取得
set "script_dir=%~dp0"

:: バッチファイルの名前から拡張子を除いた名前を取得
set "script_name=%~n0"

:: 同じディクトリの同名Pythonファイルを実行
python "%script_dir%%script_name%.py" %*

endlocal

pause

右クリックショートカットに登録するとさらに便利!

shiftjis_to_utf8.bat を右クリックしてショートカットを作成し、
Windowsキー + R を押して、「shell:sendto」と入力して、出てきたフォルダにショートカットを配置します。ショートカットの名前はわかりやすく日本語にしてOKです。

すると、ファイルやフォルダを右クリック(Windows11以降はShift+右クリック)で出てくる「送る」のところに、先ほどのショートカットが登場します。
ドラッグ&ドロップしたのと同じ扱いになっているので、もうバッチがどこにあるのかを気にしなくてOKです!

おわりに

今回のように、面倒な手作業を見つけたら、できるだけその時に汎用スクリプトを作っておくようにしています。
その時1回の手間は増えますが、長期的に見ると時間の節約になると思います。ツールは資産!

付録:スクリプトはGPT-4に書いてもらいました

6回の指示で、所望のスクリプトが出来上がりました!
自分でコードは一切書いていません。

指示1:以下のことをするpythonを書いてください ・ファイルパスのリストが引数で与えられる ・すべてのファイルに対して、ファイルの文字コードがShiftJISであればUTF-8に変換する

指示2:ドラッグ&ドロップされたファイルに対してそのpythonを実行するbatを書いてください

指示3:先ほどのpythonはコマンドライン引数を受け取らないようなので、修正してください

指示4:引数で渡されたパスがフォルダだった場合、フォルダの中を再帰的に調べて変換するようにしてください

指示5:バッチファイルを、同じフォルダにある同名のpyファイルを実行するように変えてください。 例えば、abc.bat なら、 abc.pyを実行するようにしてください

指示6:batを実行したフォルダではなく、batが存在しているフォルダの中のpyを実行してください

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