5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonでCSVをJSONに変換するときに文字コードでつまずいた件

Last updated at Posted at 2020-03-17

#概要
PythonでCSVファイルをJSONファイルに変換するツールを作ったときに、JSONファイルの中身が文字化けしてしまったので、修正方法を残しておきます。

#リソース

CSVファイル→JSONファイル変換ソース(修正前)
※参考→http://hktech.hatenablog.com/entry/2018/09/10/235725

csv_to_json.py
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ファイル

csv_sample.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 の場合、これらの文字はそのまま出力されます。

csv_to_json.py
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ファイル

json_sample.json
[{"名前": "ナダル", "順位": "2", "出身国": "スペイン"}, {"名前": "フェデラー", "順位": "3", "出身国": "スイス"}, {"名前": "ジョコビッチ", "順位": "1", "出身国": "セルビア"}]

そのまま表示された!

5
5
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
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?