#概要
PythonでCSVファイルをJSONファイルに変換するツールを作ったときに、JSONファイルの中身が文字化けしてしまったので、修正方法を残しておきます。
#リソース
CSVファイル→JSONファイル変換ソース(修正前)
※参考→http://hktech.hatenablog.com/entry/2018/09/10/235725
import json
import csv
json_list = []
# CSV ファイルの読み込み
with open('./csv_sample.csv', 'r') as f:
for row in csv.DictReader(f):
json_list.append(row)
# JSON ファイルへの書き込み
with open('./json_sample.json', 'w') as f:
json.dump(json_list, f)
# with codecs.open('./json_sample.json', 'w', 'utf-8') as f:
# json.dump(json_list, f, ensure_ascii=False)
# JSONファイルのロード
with open('./json_sample.json', 'r') as f:
json_output = json.load(f)
CSVファイル
名前,順位,出身国
ナダル,2,スペイン
フェデラー,3,スイス
ジョコビッチ,1,セルビア
#csv_to_json.pyを実行してJSONファイルを生成
csv_to_json.py実行
(csv_to_json_tool) bash-3.2$ python csv_to_json.py
実行後に生成されたJSONファイル
[{"\u540d\u524d": "\u30ca\u30c0\u30eb", "\u9806\u4f4d": "2", "\u51fa\u8eab\u56fd": "\u30b9\u30da\u30a4\u30f3"}, {"\u540d\u524d": "\u30d5\u30a7\u30c7\u30e9\u30fc", "\u9806\u4f4d": "3", "\u51fa\u8eab\u56fd": "\u30b9\u30a4\u30b9"}, {"\u540d\u524d": "\u30b8\u30e7\u30b3\u30d3\u30c3\u30c1", "\u9806\u4f4d": "1", "\u51fa\u8eab\u56fd": "\u30bb\u30eb\u30d3\u30a2"}]
文字化けしてしまった。
[file --mime]コマンドでJSONファイルの文字コードを調べてみる。
※[file --mime]コマンドについて→https://qiita.com/pugiemonn/items/106749351991037fb606
(csv_to_json_tool) bash-3.2$ file --mime json_sample.json
json_sample.json: application/json; charset=us-ascii
文字コードがus-asciiになっており、Unicodeエスケープされた状態で書き出されていたっぽい。
※文字コードと解読方法について→https://ferret-plus.com/7007
※エスケープについて→https://blog.ohgaki.net/what-is-escape#i-2
#JSONファイルの文字化けを修正
JSONファイル書き込み時のjson.dumpの第3引数で"ensure_ascii=False"を指定することで、utf-8で書き出してエスケープを回避することができました。
※Pythonのjson.dumpについて→https://docs.python.org/ja/3/library/json.html#json.dump
ensure_ascii が (デフォルト値の) true の場合、出力では入力された全ての非 ASCII 文字はエスケープされていることが保証されています。ensure_ascii が false の場合、これらの文字はそのまま出力されます。
import json
import csv
json_list = []
# CSV ファイルの読み込み
with open('./csv_sample.csv', 'r') as f:
for row in csv.DictReader(f):
json_list.append(row)
# JSON ファイルへの書き込み
with codecs.open('./json_sample.json', 'w') as f:
json.dump(json_list, f, ensure_ascii=False) #"ensure_ascii=False"を指定
# JSONファイルのロード
with open('./json_sample.json', 'r') as f:
json_output = json.load(f)
print(json_output)
(csv_to_json_tool) bash-3.2$ file --mime json_sample.json
json_sample.json: application/json; charset=utf-8
実行後に生成されたJSONファイル
[{"名前": "ナダル", "順位": "2", "出身国": "スペイン"}, {"名前": "フェデラー", "順位": "3", "出身国": "スイス"}, {"名前": "ジョコビッチ", "順位": "1", "出身国": "セルビア"}]
そのまま表示された!