💡 このスクリプトで何ができるの?
Pythonファイルの先頭に、次の修正を自動的に追加しちゃうスクリプトだよ!
- UnicodeDecodeError対策のエンコーディング設定
open
関数を上書きして、UTF-8で安全に読み書きできるように
🚀 使い方
-
まずは準備
- 持ってきたPythonファイルを、すべて1つのディレクトリにまとめてね。
- 念のためにバックアップを取っておいてね。何が起こるかわからないから、安全第一!
-
スクリプトをコピーして実行
- 以下のスクリプトをコピーして、実行してみて!
🖋️ スクリプト
import os
def update_custom_open_in_py_files(directory_path):
"""
指定されたディレクトリ内のすべての.pyファイルにおいて、
custom_open関数が存在する場合、その内容を更新する。
Args:
directory_path (str): 処理対象のディレクトリのパス
"""
# 新しいcustom_open関数の定義
new_custom_open = '''def custom_open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):
# OSによって動作を切り替え
import platform
if platform.system() == 'Linux': # UbuntuなどのLinux環境
pass # encodingはNoneのまま
elif platform.system() == 'Windows': # Windows環境
if 'b' not in mode: # バイナリモードでない場合
if encoding is None: # エンコーディングが指定されていなければ
encoding = 'utf-8' # Windowsのみutf-8を指定
return original_open(file, mode, buffering, encoding, errors, newline, closefd, opener)
'''
# ディレクトリ内のすべての.pyファイルを検索
for root, dirs, files in os.walk(directory_path):
for file in files:
if file.endswith('.py'): # .pyファイルを対象
file_path = os.path.join(root, file)
try:
# ファイル内容を読み込み
with open(file_path, 'r', encoding='utf-8') as f:
content = f.readlines()
# custom_open関数の開始と終了を特定
start_idx = None
end_idx = None
for i, line in enumerate(content):
if "def custom_open(" in line:
start_idx = i
if start_idx is not None and "builtins.open = custom_open" in line:
end_idx = i
break
# custom_open関数が見つかった場合
if start_idx is not None and end_idx is not None:
# 関数を新しい内容で置き換える
content = content[:start_idx] + [new_custom_open] + content[end_idx + 1:]
with open(file_path, 'w', encoding='utf-8') as f:
f.writelines(content)
print(f"Updated custom_open in: {file_path}")
else:
print(f"Skipped (no custom_open found): {file_path}")
except Exception as e:
print(f"Error processing {file_path}: {e}")
# 使用例
# ディレクトリパスを指定
dir_list = [
"修正pythonファイル群保存先ディレクトリpath",
"修正pythonファイル群保存先ディレクトリpath_2(",
]
for path in dir_list:
update_custom_open_in_py_files(path)
🐾 注意点
- バックアップは必ず取っておこう! このスクリプトを実行するとファイルが上書きされるよ!
- まだ問題起きるかも知れないので、慎重に。