Pythonのcsvパッケージやjsonパッケージを利用すると、CSVファイルのデータをJSON形式に簡単に変換することができる。
今回は、Pythonフレームワーク「Flask」を利用したWebアプリケーションでCSVファイルを取り込みJSON形式に変換してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事のFlaskによる環境構築と実装が完了していること。
![](https://www.purin-it.com/wp-content/uploads/2024/06/delfin-1669472_640-320x180.jpg)
また、以下のPyCharmのインストールが完了していること。
![](https://www.purin-it.com/wp-content/uploads/2020/02/dolphins-906175_640-320x180.jpg)
chardetパッケージのインストール
今回作成するプログラムでは、文字コードを判定するchardetパッケージを利用するため、これをインストールする。その手順は、以下の通り。
1) コマンドプロンプトで「pip install chardet」コマンドを実行し、最新バージョンのchardetをインストールする。
2)「pip list | find “chardet”」コマンドを実行すると、以下のように、chardetがインストールされたことが確認できる。
![](https://www.purin-it.com/wp-content/uploads/2021/11/aurora-gcb7e36182_640-320x180.jpg)
サンプルプログラムの構成
作成したサンプルプログラムの構成は、以下の通り。
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。
index.htmlの内容は以下の通りで、CSVファイルを取り込む部分と、CSVファイルのデータをJSON形式で表示するテキストエリアを追加している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <!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を呼び出す処理を実装している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | '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取込ボタン押下処理を追加している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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形式に変換する処理を実装している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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/
![](https://www.purin-it.com/wp-content/uploads/2021/11/milky-way-ge96c98dd3_640-320x180.jpg)
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) コマンドプロンプトでserver.pyが入っているフォルダに移動し、server.pyを実行する。
2) Webブラウザで「http://127.0.0.1:5000/」とアクセスすると、以下のように、index.htmlの画面が表示される。
3) 取込対象となるCSVファイルの内容は以下の通りで、文字コードがUTF-8になっているものとする。
![サンプルプログラムの実行結果_3_2](https://www.purin-it.com/wp-content/uploads/2024/06/exec_program_3_2.png)
4) 3)のファイルを指定し、「CSV取込」ボタンを押下する。
5) 以下のように、取り込んだCSVデータがJSON形式で画面に表示されることが確認できる。
6) また、以下のように、取り込んだCSVファイルが、uploadフォルダ下に作成されていることが確認できる。
7) ファイルを指定せず「CSV取込」ボタンを押下すると、以下のように、「取り込むCSVファイルを選択してください」というエラーメッセージが表示される。
![サンプルプログラムの実行結果_7_2](https://www.purin-it.com/wp-content/uploads/2024/06/exec_program_7_2.png)
8) CSVファイル以外を指定し「CSV取込」ボタンを押下すると、以下のように、「ファイルの拡張子がCSVファイルでありません」というエラーメッセージが表示される。
![サンプルプログラムの実行結果_8_2](https://www.purin-it.com/wp-content/uploads/2024/06/exec_program_8_2.png)
9) 0バイトのCSVファイルを指定し「CSV取込」ボタンを押下すると、以下のように、「CSVファイルが空になっています」というエラーメッセージが表示される。
![サンプルプログラムの実行結果_9_2](https://www.purin-it.com/wp-content/uploads/2024/06/exec_program_9_2.png)
![サンプルプログラムの実行結果_9_3](https://www.purin-it.com/wp-content/uploads/2024/06/exec_program_9_3.png)
10) UTF-8以外の文字コードをもつ場合でも、以下のように、CSVファイルのデータをJSON形式で表示できることが確認できる。
![サンプルプログラムの実行結果_10_2](https://www.purin-it.com/wp-content/uploads/2024/06/exec_program_10_2.png)
![サンプルプログラムの実行結果_10_3](https://www.purin-it.com/wp-content/uploads/2024/06/exec_program_10_3.png)
要点まとめ
- Pythonのcsvパッケージやjsonパッケージを利用すると、CSVファイルのデータをJSON形式に簡単に変換することができる。