もくじ
目標
今回は日本郵政からダウンロードしたエクセルファイルから郵便番号と住所を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)
よければこちら↓もご覧ください。
説明
import csv import json
PythonでCSVファイルや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つで整形されます。
他にもskipkeys
やcheck_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