JSON を CSV に変換する

PythonBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、Python を使って JSON データを CSV 形式に変換する方法を学びます。これは、データサイエンスと開発における一般的なタスクであり、JSON はしばしば API 応答に使用される一方、CSV は表形式のデータを格納するための人気のある形式です。

👀 プレビュー

$ head result.csv
"IP","Status","Time","HttpReferer","HttpUserAgent","Request","HttpXForwardedFor","BodyBytesSent","RemoteUser","RequestLength"
"72.55.30.187","202","[2016-02-23 16:25:10]","http://www.google.cn/search?q=hive","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0;.NET CLR 2.0.50727)","GET /index.html HTTP/1.1","-","-","-","0"
"55.222.156.202","200","[2016-02-23 16:25:10]","-","Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.0;.NET CLR 1.1.4322)","GET /login.php HTTP/1.1","-","-","-","0"
"190.215.55.29","201","[2016-02-23 16:25:10]","-","Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.0;.NET CLR 1.1.4322)","GET /view.php HTTP/1.1","-","-","-","0"
"63.132.98.30","200","[2016-02-23 16:25:10]","-","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)","GET /list.php HTTP/1.1","-","-","-","0"
"214.124.190.132","201","[2016-02-23 16:25:10]","-","Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_3 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B511 Safari/9537.53","GET /login.php HTTP/1.1","-","-","-","0"
"98.215.187.30","202","[2016-02-23 16:25:10]","-","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)","GET /upload.php HTTP/1.1","-","-","-","0"
"143.55.168.187","201","[2016-02-23 16:25:10]","-","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)","GET /login.php HTTP/1.1","-","-","-","0"
"98.190.201.29","200","[2016-02-23 16:25:10]","-","Mozilla/5.0 (Linux; Android 4.2.1; Galaxy Nexus Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19","GET /view.php HTTP/1.1","-","-","-","0"
"10.168.55.143","301","[2016-02-23 16:25:10]","http://cn.bing.com/search?q=spark mlib","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)","GET /admin/login.php HTTP/1.1","-","-","-","0"

🎯 タスク

このプロジェクトでは、以下を学びます。

  • JSON データを読み取り、理解する方法
  • JSON データを CSV ファイルに変換する方法
  • 正しい列名とフォーマットで CSV ファイルを書き込む方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • API から取得した JSON データを効率的に構造化された CSV 形式に変換する
  • JSON データを解析し、CSV ファイルに書き込むプロセスを理解する
  • これらのスキルをさまざまなデータ処理と分析タスクに適用する

JSON データを読み取り、理解する

このステップでは、web_access.jsonファイルからの JSON データを読み取り、理解する方法を学びます。

  1. テキストエディタを使って、~/projectディレクトリにあるweb_access.jsonファイルを開きます。
  2. ファイルの内容を調べます。オブジェクトの配列が見えるはずで、各オブジェクトはウェブアクセスログエントリを表します。各エントリには、"IP""Status""Time""HttpReferer""HttpUserAgent""Request""HttpXForwardedFor""BodyBytesSent""RemoteUser""RequestLength"などのいくつかのプロパティがあります。
  3. JSON データの構造と内容に慣れます。この情報は、次のステップでデータを CSV 形式に変換する際に役立ちます。
✨ 解答を確認して練習

JSON を CSV に変換する

このステップでは、web_access.jsonファイルからの JSON データを CSV ファイルに変換する方法を学びます。

  1. ~/projectディレクトリに新しい Python ファイルconvert.pyを作成します。
  2. convert.pyファイルで必要なライブラリをインポートします:
import csv
import json
  1. web_access.jsonファイルから JSON データを読み取ります:
with open("web_access.json", "r") as json_file:
    data = json.load(json_file)
  1. CSV ファイルの列の順序を定義します:
fieldnames = [
    "IP",
    "Status",
    "Time",
    "HttpReferer",
    "HttpUserAgent",
    "Request",
    "HttpXForwardedFor",
    "BodyBytesSent",
    "RemoteUser",
    "RequestLength",
]
  1. ~/projectディレクトリに新しい CSV ファイルresult.csvを開き、csv.DictWriterオブジェクトを作成します:
with open("result.csv", "w", newline="") as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_ALL)
  1. CSV ファイルにヘッダー行を書き込みます:
writer.writeheader()
  1. データ行を CSV ファイルに書き込みます:
for row in data:
    writer.writerow(row)

完成したconvert.pyファイルは次のようになります:

import csv
import json

## ファイルから JSON データを読み取る
with open("web_access.json", "r") as json_file:
    data = json.load(json_file)

## 列の順序を定義する
fieldnames = [
    "IP",
    "Status",
    "Time",
    "HttpReferer",
    "HttpUserAgent",
    "Request",
    "HttpXForwardedFor",
    "BodyBytesSent",
    "RemoteUser",
    "RequestLength",
]

## CSV ファイルに書き込む
with open("result.csv", "w", newline="") as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames, quoting=csv.QUOTE_ALL)

    ## ヘッダーを書き込む
    writer.writeheader()

    ## データ行を書き込む
    for row in data:
        writer.writerow(row)
✨ 解答を確認して練習

Python スクリプトを実行する

このステップでは、convert.pyスクリプトを実行してresult.csvファイルを生成します。

  1. ターミナルを開き、~/projectディレクトリに移動します。
  2. 次のコマンドを使ってconvert.pyスクリプトを実行します:
python convert.py
  1. スクリプトが完了すると、~/projectディレクトリに新しいresult.csvファイルが表示されるはずです。
  2. 次のコマンドを使ってresult.csvファイルの最初の 10 行を表示できます:
head result.csv

これにより、CSV ファイルのヘッダー行と最初の 9 つのデータ行が出力されるはずです。

"IP","Status","Time","HttpReferer","HttpUserAgent","Request","HttpXForwardedFor","BodyBytesSent","RemoteUser","RequestLength"
"72.55.30.187","202","[2016-02-23 16:25:10]","http://www.google.cn/search?q=hive","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0;.NET CLR 2.0.50727)","GET /index.html HTTP/1.1","-","-","-","0"
"55.222.156.202","200","[2016-02-23 16:25:10]","-","Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.0;.NET CLR 1.1.4322)","GET /login.php HTTP/1.1","-","-","-","0"
"190.215.55.29","201","[2016-02-23 16:25:10]","-","Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.0;.NET CLR 1.1.4322)","GET /view.php HTTP/1.1","-","-","-","0"
"63.132.98.30","200","[2016-02-23 16:25:10]","-","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)","GET /list.php HTTP/1.1","-","-","-","0"
"214.124.190.132","201","[2016-02-23 16:25:10]","-","Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_3 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B511 Safari/9537.53","GET /login.php HTTP/1.1","-","-","-","0"
"98.215.187.30","202","[2016-02-23 16:25:10]","-","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)","GET /upload.php HTTP/1.1","-","-","-","0"
"143.55.168.187","201","[2016-02-23 16:25:10]","-","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)","GET /login.php HTTP/1.1","-","-","-","0"
"98.190.201.29","200","[2016-02-23 16:25:10]","-","Mozilla/5.0 (Linux; Android 4.2.1; Galaxy Nexus Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19","GET /view.php HTTP/1.1","-","-","-","0"
"10.168.55.143","301","[2016-02-23 16:25:10]","http://cn.bing.com/search?q=spark mlib","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)","GET /admin/login.php HTTP/1.1","-","-","-","0"

おめでとうございます!web_access.jsonファイルの JSON データをresult.csvという名前の CSV ファイルに正常に変換しました。

✨ 解答を確認して練習

まとめ

おめでとうございます!このプロジェクトを完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を行って練習してください。