Pythonのcsvパッケージやjsonパッケージを利用すると、CSVファイルのデータをJSON形式に簡単に変換することができる。
今回は、Pythonフレームワーク「Flask」を利用したWebアプリケーションでCSVファイルを取り込みJSON形式に変換してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事のFlaskによる環境構築と実装が完了していること。
chardetパッケージのインストール
今回作成するプログラムでは、文字コードを判定するchardetパッケージを利用するため、これをインストールする。その手順は、以下の通り。
1) コマンドプロンプトで「pip install chardet」コマンドを実行し、最新バージョンのchardetをインストールする。
2)「pip list | find “chardet”」コマンドを実行すると、以下のように、chardetがインストールされたことが確認できる。
サンプルプログラムの作成
作成したサンプルプログラムの構成は、以下の通り。
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。
index.htmlの内容は以下の通りで、CSVファイルを取り込む部分と、CSVファイルのデータをJSON形式で表示するテキストエリアを追加している。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <script src="../static/demo.js"></script> <title>CSVファイル取込</title> </head> <body> 取り込んだCSVファイルのデータを、JSON形式で出力します。 <br/><br/> <form enctype="multipart/form-data"> <input type="file" id="csv_file" name="csv_file" /> <input type="button" value="CSV取込" onclick="import_csv()" /> <br/><br/> <textarea rows="35" cols="50" placeholder="ここにJSON形式のCSVデータが表示されます">{{ json_txt }}</textarea> </form> </body> </html>
また、demo.jsの内容は以下の通りで、チェック処理と、views.pyのパス/import-csvを呼び出す処理を実装している。
'use strict'; // CSV取込ボタン押下処理 function import_csv(){ let form = document.getElementsByTagName("form")[0]; let csv_file = document.getElementById("csv_file").value if(!csv_file){ alert("取り込むCSVファイルを選択してください"); return; } if(csv_file.substr(-4).toLowerCase() != ".csv"){ alert("ファイルの拡張子がCSVファイルでありません"); return; } let csv_file_obj = document.getElementById("csv_file").files[0]; if(csv_file_obj.size == 0){ alert("CSVファイルが空になっています"); return; } form.action="/import-csv"; form.method="post"; form.submit(); }
さらに、views.pyの内容は以下の通りで、CSV取込ボタン押下処理を追加している。
from demo import app from flask import render_template, request from .csv_json import CsvToJson # 初期表示処理 @app.route("/") def index(): return render_template("index.html", json_txt="") # CSV取込ボタン押下処理 @app.route('/import-csv', methods=['POST']) def import_csv(): # アップロードしたCSVファイルを保存し、CSVファイルのデータをJSONに変換する csv_json = CsvToJson(request.files.get("csv_file")) json_txt = csv_json.upload_csv_to_json() # JSONに変換したCSVデータを設定し、画面遷移する return render_template("index.html", json_txt=json_txt)
また、csv_json.pyの内容は以下の通りで、views.pyから呼ばれる、取り込んだCSVファイルの保存と、CSVファイルのデータをJSON形式に変換する処理を実装している。
import json import csv from chardet import detect # CSVファイルのデータをチェックし、JSONに変換するクラス class CsvToJson: # 引数にCSVファイルを渡してインスタンスを生成 def __init__(self, req_file): self.req_file = req_file # アップロードしたCSVファイルを保存し、 # CSVファイルのデータをJSONに変換して返す def upload_csv_to_json(self): # アップロードしたCSVファイルを保存 req_file_path = "./demo/upload/" + self.req_file.filename self.req_file.save(req_file_path) # CSVファイルの文字コードを判定 # 判定した文字コードがSHIFT_JISの場合は、CP932に変換する f = open(req_file_path, 'rb') rawdata = f.read() f.close() encoding = detect(rawdata)['encoding'] if "SHIFT_JIS" == encoding: encoding = "CP932" # アップロードしたCSVファイルを読み込み、json_listに追加する json_list = [] f = open(req_file_path, 'r', encoding=encoding) csv_reader = csv.DictReader(f) for row in csv_reader: json_list.append(row) f.close() # json_listをJSON形式に変換した値を返す # ensure_ascii=Falseを指定することで、日本語のままJSON文字列を出力する # indent=2を指定することで、読みやすく改行したJSON文字列になる return json.dumps(json_list, ensure_ascii=False, indent=2)
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/python/tree/master/make-flask-csv-to-json/
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) コマンドプロンプトでserver.pyが入っているフォルダに移動し、server.pyを実行する。
2) Webブラウザで「http://127.0.0.1:5000/」とアクセスすると、以下のように、index.htmlの画面が表示される。
3) 取込対象となるCSVファイルの内容は以下の通りで、文字コードがUTF-8になっているものとする。
4) 3)のファイルを指定し、「CSV取込」ボタンを押下する。
5) 以下のように、取り込んだCSVデータがJSON形式で画面に表示されることが確認できる。
6) また、以下のように、取り込んだCSVファイルが、uploadフォルダ下に作成されていることが確認できる。
7) ファイルを指定せず「CSV取込」ボタンを押下すると、以下のように、「取り込むCSVファイルを選択してください」というエラーメッセージが表示される。
8) CSVファイル以外を指定し「CSV取込」ボタンを押下すると、以下のように、「ファイルの拡張子がCSVファイルでありません」というエラーメッセージが表示される。
9) 0バイトのCSVファイルを指定し「CSV取込」ボタンを押下すると、以下のように、「CSVファイルが空になっています」というエラーメッセージが表示される。
10) UTF-8以外の文字コードをもつ場合でも、以下のように、CSVファイルのデータをJSON形式で表示できることが確認できる。
要点まとめ
- Pythonのcsvパッケージやjsonパッケージを利用すると、CSVファイルのデータをJSON形式に簡単に変換することができる。