1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonでJSONを読み込んでCSV出力する

Last updated at Posted at 2020-07-13

目的

JSONファイルを読み込んで中身を集計してCSV出力するためのプログラムです。
集計内容は用途によって変わるので、JSONを読み込んで出す、というところだけを作っています。

行うこと

  • ファイル選択ダイアログを表示する
  • JSONファイルを読み込む
  • 集計してCSV出力する

ファイル選択ダイアログを表示する

GUI(ファイル選択ダイアログ)を表示するためにtkinterを使用します。
実行したらすぐにファイル選択ダイアログが表示され、JSONファイルのみを選択できるようにします。

# モジュールのインポート
import os, tkinter, tkinter.filedialog

# ファイル選択ダイアログの表示
root = tkinter.Tk()
root.withdraw()

# jsonファイルのみを選択可能にする
fTyp = [("","*.json")]
iDir = os.path.abspath(os.path.dirname(__file__))
file = tkinter.filedialog.askopenfilename(filetypes = fTyp, initialdir = iDir)

# 選択したファイルのパスを確認
print(file)

JSONファイルを読み込む

ファイル選択ができるようになったらJSONファイルの中身を確認します。
jsonライブラリを追加してファイルを読込み扱えるようにします。

# モジュールのインポート
import os, json, tkinter, tkinter.filedialog

# ファイル選択ダイアログの表示
root = tkinter.Tk()
root.withdraw()

# jsonファイルのみを選択可能にする
fTyp = [("","*.json")]
iDir = os.path.abspath(os.path.dirname(__file__))
file = tkinter.filedialog.askopenfilename(filetypes = fTyp, initialdir = iDir)

# jsonファイルを読み込む
json_open = open(file, 'r', encoding="utf-8")
json_load = json.load(json_open)

# jsonファイルの中身を確認
print(json_load[0])

CSV出力する(完成)

JSONファイルを読み込めたのでCSVに出力できるようにしましょう。

# モジュールのインポート
import os, json, csv, tkinter, tkinter.filedialog

# ファイル選択ダイアログの表示
root = tkinter.Tk()
root.withdraw()

# jsonファイルのみを選択可能にする
fTyp = [("","*.json")]
iDir = os.path.abspath(os.path.dirname(__file__))

# ファイル情報を取得
file = tkinter.filedialog.askopenfilename(filetypes = fTyp, initialdir = iDir)

# jsonファイルを読み込む
json_open = open(file, 'r', encoding='utf-8')
json_load = json.load(json_open)

# CSVヘッダーの設定
csv_header = ['H1', 'H2', 'H3']
csv_pack = []
csv_pack.append(csv_header)

# ※JSON例
# json_load = {'c1':'Test1','c2':'tEst2','c3':'teSt3'}

# 出力内容を集計
for item in json_load:
  # 1行分の情報を初期化
  csv_line = [''] * 5

  # JSONの情報を取得
  csv_line[0] = item['c1']
  csv_line[1] = item['c2']
  csv_line[2] = item['c3']

  # 1行分を格納
  csv_pack.append(copy.copy(csv_line))

# CSVを出力するフォルダとファイル名を設定(読み込んだJSONファイルと同じ場所に同じ名前)
folder_file = os.path.split(file)
folder = folder_file[0] # フォルダパスを取得
file_name = file.rsplit('/', 1)[1][0:-5] # ファイル名を取得
csv_file_path = folder + '/' + file_name + '.csv'

# CSVファイルを作成(既に存在すれば上書き)
if not os.path.isfile(csv_file_path):
  open(csv_file_path, 'x', encoding='utf-8')
csv_file = open(csv_file_path, 'w', encoding='utf-8')

# CSVに書込み
w = csv.writer(csv_file, lineterminator='\n')
w.writerows(csv_pack)
csv_file.close()

以上。
あとはお好みで集計しましょう。

おまけ

フォルダ内の全てのJSONファイルを取得して集計する場合

# モジュールのインポート
import os, json, copy, csv, datetime, glob, tkinter, tkinter.filedialog, tkinter.messagebox

# フォルダ選択ダイアログの表示
root = tkinter.Tk()
root.withdraw()

# フォルダ内のJSONファイルを取得する
iDir = os.path.abspath(os.path.dirname(__file__))
iDirPath = tkinter.filedialog.askdirectory(initialdir = iDir)
files = glob.glob(iDirPath + "/" + "*.json")

# CSVヘッダーの設定
csv_header = ['H1', 'H2', 'H3', 'H4', 'H5']
csv_pack = []
csv_pack.append(csv_header)

# JSONファイルを1つずつ取得して処理をする
folder = ''
for file in files:
  # ファイルパスからフォルダとファイル名を切り離す
  folder_file = os.path.split(file)

  # フォルダパスのみを取得
  folder = folder_file[0]

  # JSONファイルを読み込む
  json_open = open(file, 'r', encoding='utf-8')
  json_load = json.load(json_open)

  # ※JSON例
  # json_load = {'c1':'Test1','c2':'tEst2','c3':'teSt3','c4':'tesT3','c5':'test1'}

  # 出力内容を集計
  for item in json_load:
    # 1行分の情報を初期化
    csv_line = [''] * 5

    # JSONの情報を取得
    csv_line[0] = item['c1']
    csv_line[1] = item['c2']
    csv_line[2] = item['c3']
    csv_line[3] = item['c4']
    csv_line[4] = item['c5']

    # 1行分を格納
    csv_pack.append(copy.copy(csv_line))

# リンクCSVファイルを作成
if not '' == folder:
  # CSVを作成(既にファイルがあれば上書き)
  csv_file_path = folder + '/sum.csv'
  if not os.path.isfile(csv_file_path):
    open(csv_file_path, 'x', encoding='cp932')
  csv_file = open(csv_file_path, 'w', encoding='cp932')

  # CSVに書込み
  w = csv.writer(csv_file, lineterminator='\n')
  w.writerows(csv_pack)
  csv_file.close()

  # メッセージ
  tkinter.messagebox.showinfo('処理完了', '選択したフォルダ内のJSONをCSVに変換して出力しました。')
else:
  tkinter.messagebox.showinfo('エラー', 'フォルダが選択されていないかファイルが見つかりません。')

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?