1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ubuntuからwindowsに持ってきたpythonファイルが動かない人へ。

Last updated at Posted at 2025-01-03

💡 このスクリプトで何ができるの?

Pythonファイルの先頭に、次の修正を自動的に追加しちゃうスクリプトだよ!

  1. UnicodeDecodeError対策のエンコーディング設定
  2. open関数を上書きして、UTF-8で安全に読み書きできるように

🚀 使い方

  1. まずは準備

    • 持ってきたPythonファイルを、すべて1つのディレクトリにまとめてね。
    • 念のためにバックアップを取っておいてね。何が起こるかわからないから、安全第一!
  2. スクリプトをコピーして実行

    • 以下のスクリプトをコピーして、実行してみて!

🖋️ スクリプト

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)


🐾 注意点

  • バックアップは必ず取っておこう! このスクリプトを実行するとファイルが上書きされるよ!
  • まだ問題起きるかも知れないので、慎重に。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?