はじめに
Python組み込みの「json」モジュールで、JSONファイルに日本語をそのまま出力する方法を解説します。
jsonモジュールでは、日本語の文字列をJSONファイルに出力する際、「\u30e6」のようなUnicodeエスケープ(シーケンス)という形式で出力します。別プログラム・環境で読み込むには便利な形式ですが、人が読むには非常に見ずらい形式です。
そこで今回は、日本語の文字列をエスケープシーケンスなしで出力する方法について解説します。
環境
この記事は以下の環境で作成しています。
環境 | バージョンなど |
Python | 3.9.6 |
OS | Wiindows10 |
実行結果
後述の「日本語のJSONファイルを出力するコード」の実行結果です。
「enseure_ascii = false」の指定の有無で、以下のようにUnicodeエスケープあり・なしの日本語が出力されます。
人が読めるかたちで日本語を出力する場合は、「ensure_ascii=False」を指定します。
ensure_ascii=False の指定なし
「Roles」の部分が、Unicodeエスケープの形式で表示されています。
{
"Email": "taro@example.com",
"Active": true,
"CreatedDate": "2013-01-20T00:00:00Z",
"Roles": [
"\u30e6\u30fc\u30b6\u30fc",
"\u7ba1\u7406\u8005"
]
}
ensure_ascii=False の指定あり
「Roles」の部分が、人が読める形で出力されています。
{
"Email": "taro@example.com",
"Active": true,
"CreatedDate": "2013-01-20T00:00:00Z",
"Roles": [
"ユーザー",
"管理者"
]
}
全体コード
「 日本語のJSONファイルを出力するコード 」の全体です。ポイント部分は後述の「コードのポイント」で詳しく解説します。
import json
# JSONファイルを作成するための辞書を作成します
# (Rolesの部分に日本語の文字列が含まれています)
dict = {}
dict["Email"] = "taro@example.com"
dict["Active"] = True
dict["CreatedDate"] = "2013-01-20T00:00:00Z"
dict["Roles"] = ["ユーザー", "管理者"]
# ensure_ascii "なし" で出力します
with open("output_uniEscape.json", "w", encoding="utf-8" ) as outputFile:
json.dump(dict, outputFile, indent=2 )
# ensure_ascii "あり" で出力します
with open("output_jp.json", "w", encoding="utf-8") as outputFile:
json.dump(dict, outputFile, indent=2, ensure_ascii=False )
コードのポイント
「ensure_ascii = false」 の指定で日本語がそのまま出力できる
JSONファイルを出力するdump関数に「ensure_ascii = False 」を指定することで、日本語の文字列をそのままファイルに出力できます。
# ensure_ascii "なし" で出力します
with open("output_uniEscape.json", "w", encoding="utf-8" ) as outputFile:
json.dump(dict, outputFile, indent=2 )
# ensure_ascii "あり" で出力します
with open("output_jp.json", "w", encoding="utf-8") as outputFile:
json.dump(dict, outputFile, indent=2, ensure_ascii=False )
出力結果 ensure_ascii = False あり
{
"Email": "taro@example.com",
"Active": true,
"CreatedDate": "2013-01-20T00:00:00Z",
"Roles": [
"ユーザー",
"管理者"
]
}
出力結果 ensure_ascii = False なし
{
"Email": "taro@example.com",
"Active": true,
"CreatedDate": "2013-01-20T00:00:00Z",
"Roles": [
"\u30e6\u30fc\u30b6\u30fc",
"\u7ba1\u7406\u8005"
]
}
【参考】JSONファイルの文字コードについて
pythonのコードはデフォルトで「utf-8」が設定されていますが、open関数を書き込みモードで使うと、デフォルトで「shift-jis」のファイルが作成されます。
VisualStudioCodeで、Pythonコードと一緒にJSONファイルを開くと今度は、「shift-jisに起因した文字化け」が起きて混乱するので、open関数には「encode=”utf-8″」の指定を入れることお勧めします。
まとめ
Python組み込みの「json」モジュールを使って、 JSONファイルに日本語をそのまま出力する方法を解説しました。 参考になればうれしいです。
お知らせ
3月号の『日経ソフトウェア』はPythonの特集。穴埋め式クイズで学ぶPython入門や、PythonでExcelを動かす方法などが特集されています。
jsonモジュールのその他の使い方
このブログではjsonモジュールの以下の内容も公開しています。興味のある方は是非以下の記事もご覧ください。
jsonモジュールでJSONファイルを読み込む方法
jsonモジュールでJSONファイル・JSON文字列を出力する方法
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。
アノテーションツールの doccano でアノテーションしたファイルを export すると、文字化けした jsonlファイルが出力されます。
そこで、jsonlファイルを正常な日本語で出力するにはどうすればいいのか調べていて、貴ページに辿り着きました。
そこでご質問ですが、上記のコードはPython のどのファイルに書けばいいのでしょうか?
何分初心者ですので、見当違いの質問をしているのかもしれませんが、どうぞよろしくお願いします。
etohさん
ご質問ありがとうございます、えすです。
doccanoは詳しくないのですが、
tutorialを見た感じだと、doccano内のコードが文字化けのjsonlファイルを出力しているようなので、
コードは「doccanoの中のjsonlを出力している部分」に書くことになります。
ただ中々敷居が高い作業なので、
自作のjsonl変換プログラムを作って、その中で文字化けを正しい日本語に変換する方が簡単かと思います。
〇 イメージ
doccano -> 「文字化けjsonl」 -> 自作python ->「文字化け修正jsonl」-> jsonlを使いたいプログラム
※ 「jsonlを使いたいプログラム」から、再度doccanoへ「Import」する場合は、
「文字化けしたjsonl」に戻さないとdoccano側で正しく認識されない可能性があるので注意してください。
検討違いな回答になっていたらすみません。
分からない部分などあったら、追加のコメントで教えてください。
参考になればうれしいです。