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
以上