【Python】Excel(CSV)をjsonで書き出す

もくじ

目標

今回は日本郵政からダウンロードしたエクセルファイルから郵便番号と住所をjsonで書き出せるようにします。

郵便番号データダウンロード - 日本郵便

上記サイトから読み仮名データの促音・拗音を小書きで表記するもの全国一括をダウンロードしました。

手順

pythonファイルを作成

実行したいディレクトリでファイルを作成します。ファイル名などは任意につけてください。

$ mkdir zipcode
$ cd zipcode
$ touch zipcode-json.py
zipcode
 ├──zipcode-json.py
 └──KEN_ALL.CSV // ダウンロードしたCSVファイル

pythonファイル

作成したpythonファイル(zipcode-json.py)を開き下記の内容で保存します。

全体像

import csv
import json

csv_file = open("./KEN_ALL.CSV", "r", encoding="ms932", errors="", newline="" )
reader = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

code = {}
for row in reader:
  address = {}

  # 郵便番号
  zipcode = row[2]
  # 都道府県
  address["pref"] = row[6]
  # 市区町村
  if row[8] == "以下に掲載がない場合" :
    address["city"] = row[7]
  else:
    address["city"] = row[7] + row[8]

  code[zipcode] = address

with open('./zipcode.json', 'w') as f:
  json.dump(code, f, ensure_ascii=False, indent=4)

よければこちら↓もご覧ください。

bonoponz.hatenablog.com

説明

import csv
import json

PythonCSVファイルやjsonを扱うには各モジュールをインポートしています。

csv_file = open("./KEN_ALL.CSV", "r", encoding="ms932", errors="", newline="" )
reader = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

openの第一引数に読み込みたいcsvファイルのパスを記述し、csvモジュールのcsv.readerクラスを使用してcsvファイルを読み込みます。

それを使いやすいように変数に格納しています。

for row in reader:
  address = {}

  # 郵便番号
  zipcode = row[2]
  # 都道府県
  address["pref"] = row[6]
  # 市区町村
  if row[8] == "以下に掲載がない場合" :
    address["city"] = row[7]
  else:
    address["city"] = row[7] + row[8]

forによってrowに一行ずつデータが格納されます。要素数が列番号になります。

row[2]とすると3列目が取得できるので今回の場合は郵便番号が取得できます。同様に都道府県や市区町村名も取得します。

with open('./zipcode.json', 'w') as f:
  json.dump(code, f, ensure_ascii=False, indent=4)

ここでjsonファイルを作成しています。

  • ensure_ascii
ensure_ascii= 結果
true(デフォルト) 入力された全ての非ASCII文字はエスケープされる
false 文字はそのまま出力
  • indent
indent= 結果
None(デフォルト) 最もコンパクトな表現
正の数 指定した数のスペースでインデント
0 OR 負数 OR "" 改行のみ挿入

今回はindent=4を指定したので、スペース4つで整形されます。

他にもskipkeyscheck_circularなどのオプションを指定できるのでいろいろいじってみてください。

整形

前項で少し述べたindentについてです。

json出力時に整形するようにしましたが、データ量が多いとその分インデントも増えファイルサイズが大きくなります。そこで、整形の必要がなければindent=Noneにしましょう。

  • インデント有
json.dump(code, f, ensure_ascii=False, indent=4)
{
    "600000": {
        "pref": "北海道",
        "city": "札幌市中央区"
    },
    "640941": {
        "pref": "北海道",
        "city": "札幌市中央区旭ケ丘"
    },
    "600041": {
        "pref": "北海道",
        "city": "札幌市中央区大通東"
    },
    "600042": {
        "pref": "北海道",
        "city": "札幌市中央区大通西(1~19丁目)"
    },
    "640820": {
        "pref": "北海道",
        "city": "札幌市中央区大通西(20~28丁目)"
    },
    "600031": {
        "pref": "北海道",
        "city": "札幌市中央区北一条東"
    }
}
  • インデント無
json.dump(code, f, ensure_ascii=False, indent=None)
{"600000": {"pref": "北海道", "city": "札幌市中央区"}, "640941": {"pref": "北海道", "city": "札幌市中央区旭ケ丘"}, "600041": {"pref": "北海道", "city": "札幌市中央区大通東"}, "600042": {"pref": "北海道", "city": "札幌市中央区大通西(1~19丁目)"}, "640820": {"pref": "北海道", "city": "札幌市中央区大通西(20~28丁目)"}, "600031": {"pref": "北海道", "city": "札幌市中央区北一条東"}}

サンプルとして中身は縮小しました。

実行

zipcodeディレクトリで下記を実行すればjsonファイルが同ディレクトリに出力されます。

$ python3 zipcode-json.py
zipcode
 ├──zipcode-json.py
 ├──zipcode.json
 └──KEN_ALL.CSV

完成です!

csvからjsonを作る作業を自動化するときにご活用ください。

参考URL

json --- JSON エンコーダおよびデコーダ — Python 3.9.4 ドキュメント

Pythonで「SyntaxError: Non-ASCII character〜」が出てしまった時の解決法 - Qiita

pythonでExcelのデータをJSONに変換する - Qiita

pythonを使ってエクセルからJSONデータに変換

マスターしよう!PythonでのCSVファイル操作方法を徹底解説! | TechTeacher Blog