Python | Django | バックアップ (backup) | BOMなしのutf-8 jsonファイルへの変換方法

Pythonとは,高レベルの汎用プログラミング言語であり,読みやすさとシンプルさで知られている.Web開発やデータサイエンス,人口知能,機械学習など幅広く利用されている.なお,レベルの高低はハードウェアに近いかどうかを意味しており,レベルが低いとハードウェアに近いことを意味している.

Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.

本記事では,BOMありのutf-8 jsonファイルからBOMなしのutf-8 jsonファイルへの変換方法を記す.

実施環境

Windows 11
Python 3.12.0
Django 5.2.3
Visual Studio Code (VS Code) 1.102.2

shelokuma tech blog | バージョン確認方法

背景

DjangoとReactでwebアプリを開発時,データベースをSqliteからPostgreSQLへ変更を試みた.変更前(Sqlite利用中)にバックアップを実行したが,BOMなしのutf-8 jsonファイルを出力することができなかった.

PostgreSQLにバックアップファイルであるBOMありのutf-8 jsonファイルをインポートするとエラーが出力された.そのため,BOMなしのutf-8 jsonファイルへの変換方法を記す.

BOM(Byte Order Mark)についての説明

BOM (Byte Order Mark)とは、テキストファイルの先頭に付加される特別なバイト列で、文字コードの種類やバイト順 (エンディアン)を示す役割を持っている.

utf-8におけるBOMは,EF BB BF (16進数の3バイト)となる.utf-8自体はエンディアンの影響を受けないため,BOMは必須ではないが,windowsのメモ帳などではBOMを付けて保存される.

BOMは文字コードを識別しやすくなるが,一部のツールやライブラリ (json.load()など)がBOM付きのファイルを正常に読み込めないことがある.

BOMなしのutf-8 jsonファイルへの変換方法

私の開発構成は,以下ディレクトリ構成となっている.

SDS_dev
├── frontend/
└── backend/

VS Codeを開き,Terminalでbackendディレクトリに移動する.pipenvを実行し,以下コマンドを実行する.backendディレクトリに,fixed_sqlite_data.jsonが保存される (BOMありのutf-8で保存することができる).

※VS Code上でutf-8のjsonファイルを開き,右下のutf-8 with BOMをクリックし,Reopen with Encodingでutf-8を選び,Save with Encodingでutf-8を選ぶと,NULLが出現しファイルが壊れてしまった.

$ python manage.py dumpdata --indent 2 > fixed_sqlite_data.json

なお,以下コマンドを実行すると,私の場合,utf-16 LEで保存された.

$ python manage.py dumpdata > sqlite_data.json

backendディレクトリに"convert_to_utf8_nobom.py"を作成し,以下コードを記載する.当該コードを実行することによって,BOMありのutf-8 jsonファイルである"fixed_sqlite_data.json"をBOMなしのutf-8 jsonファイルに変換することができる.

with open('fixed_sqlite_data.json', 'r', encoding='utf-8-sig') as f:
    data = f.read()

with open('cleaned_sqlite_data.json', 'w', encoding='utf-8') as f:
    f.write(data)

Terminalにて以下コマンドを実行し,backendディレクトリにCOMなしのutf-8 jsonファイルである"cleaned_sqlite_data.json"に変換することができる.

$ python convert_to_utf8_nobom.py

以上