見出し画像

【python】jsonっぽいファイル「jsonl(JSON LINES)」をcsvに書き換えるまで

※2023/02/23追記:
もっといい方法があるよとChatGPTに教わったので、教わった内容を共有します。

私はデータ分析業務に携わってますが、たま~に変なデータ形式のファイルに遭遇します。こういう変なデータにあたってしまうとデータの成型に時間を要してしまうんですよね。

以前、jsonっぽいファイルをCSVデータに加工するまでに時間かかってしまったので備忘録がてら作業工程を残しておきます。

※実を言うとコマンド操作で簡単に変換可能ですが、pythonを使用した力業で変換処理してます。

jsonっぽいファイルというのは、jsonl(JSON LINES)ってファイルですね。
jsonファイルと異なるのは、「[」と「]」による囲みが無いのと、「{」「}」の間に「,」がありません。

//-- jsonl(json lines) file sample
 {
    "client_no": 0001,
    "name": "yamada ichiro",
    "class1": null,
    "class2": null,
    "class3": null,
    "class4": null,
    "code": "0000",
    "remarks": null
 }
 {
    "client_no": 0002,
    "name": "kato jiro",
    "class1": null,
    "class2": null,
    "class3": null,
    "class4": null,
    "code": "0000",
    "remarks": null
 }
 {
    "client_no": 0003,
    "name": "saito saburo",
    "class1": null,
    "class2": null,
    "class3": null,
    "class4": null,
    "code": "0000",
    "remarks": null
 }
 {
    "client_no": 0004,
    "name": "suzuki shiro",
    "class1": null,
    "class2": null,
    "class3": null,
    "class4": null,
    "code": "0000",
    "remarks": null
 }
//-- json file sample
[
 {
    "client_no": 0001,
    "name": "yamada ichiro",
    "class1": null,
    "class2": null,
    "class3": null,
    "class4": null,
    "code": "0000",
    "remarks": null
 },
 {
    "client_no": 0002,
    "name": "kato jiro",
    "class1": null,
    "class2": null,
    "class3": null,
    "class4": null,
    "code": "0000",
    "remarks": null
 },
 {
    "client_no": 0003,
    "name": "saito saburo",
    "class1": null,
    "class2": null,
    "class3": null,
    "class4": null,
    "code": "0000",
    "remarks": null
 },
 {
    "client_no": 0004,
    "name": "suzuki shiro",
    "class1": null,
    "class2": null,
    "class3": null,
    "class4": null,
    "code": "0000",
    "remarks": null
 }
]

私はAWSで作業するうえで必要なデータの形がCSVでしたので、この形をした大量のファイルを一括でCSVに変える必要がありました。

まぁ、力業といえば力業なんですが。
以下のSTEPでCSVに変換しました。

step 1. ファイルの先頭に「[」を追加する。
step 2. ファイルの最後に「]」を追加する。
step 3. 「}」を「},」に置換する。
step 4. 「},]」を「}]」に置換する。
step 5. json形式をCSV形式に変換する。

この工程をpythonを使って行いましたので、記録として残しておきます。
サンプルコードは以下の通りです。参考になると嬉しいです。

step 1. ファイルの先頭に「[」を追加する。

#-- step1: sample code

import os

path = "./"
files = os.listdir(path)

for file in files:
 if '.jsonl' in file:
   with open(file, 'r+', encoding='utf-8') as file:
       # 全行取得
       line = file.readlines()
       # 途中に挿入
       line.insert(0, '[')
       # ファイルデータ全削除
       file.truncate(0)
       # 先頭にストリームを移動
       file.seek(0, os.SEEK_SET)
       # 書き込み
       file.writelines(line)

「pythonファイル」が格納されているフォルダと同じディレクトリに存在するファイルに対して一括で処理をかけれます。意外とファイルの頭に文字を挿入するやり方は珍しいので、この方法を知っておくと応用が効くと思います。
「 line.insert(0, '[')」を使用することで、好きな行に挿入することができます。引数1に指定した数字の行数に引数2が挿入されます。

step 2. ファイルの最後に「]」を追加する。

#-- step2: sample code

import os

path = "./"
files = os.listdir(path)

for file in files:
 if '.jsonl' in file:
   with open(file, mode='a') as f:
     f.write(']')

ファイルの最後に追記するやり方は意外と多く出回っているので、このやり方はそこまで苦戦しませんでした。純粋にファイルを開いて「write(']')」で最後に任意の文字を追記できます。

step 3. 「}」を「},」に置換する。

#-- step3: sample code

import os

path = "./"
files = os.listdir(path)

for file in files:
 if '.jsonl' in file:
   with open(file, 'r') as f:
     fileText = f.read()
     after = fileText.replace('}', '},') 
   filename = "jsonl2/" + file
   with open(filename, 'w') as fa:
       fa.write(after)

   fin = open(file, "rt")
   fout = open(file + ".jsonl", "wt")
   fout.write(file.replace('}', '},'))
   fin.close()
   fout.close()

「replace('}', '},')」を使ってファイル内の文字を置換しています。ファイル名の置換ではなく、ファイル内の文字列に対する置換処理です。少し珍しいやり方だと思います。

step 4. 「,]」を「]」に置換する。

#-- step4: sample code

import os

path = "./"
files = os.listdir(path)

for file in files:
 if '.jsonl' in file:
   with open(file, 'r') as f:
     fileText = f.read()
     after = fileText.replace(',]', ']') 
   filename = "jsonl2/" + file
   with open(filename, 'w') as fa:
       fa.write(after)

   fin = open(file, "rt")
   fout = open(file, "wt")
   fout.write(file.replace(',]', ']'))
   fin.close()
   fout.close()

step3までの処理ですと、最終行だけ「},]」になってしまい、「,」が邪魔ですので、この「,」を取り除いてあげる必要があるわけです。
これに関しても「replace(',]', ']')」を使って処理してあげます。
ファイル内の文字列を置換するやり方についてはstep3のやり方と同様です。

ここまでのステップで対象のファイルは全てJSON形式に変わりました。

step 5. json形式をCSV形式に変換する。

#-- step5: sample code

# Pandasをインポート
import pandas as pd
import os
path = "./"
files = os.listdir(path)

for file in files:
 if '.json' in file:
   # 変換したいJSONファイルを読み込む
   df = pd.read_json(file)
   # CSVに変換して任意のファイル名で保存
   df.to_csv("csv/" + file + ".csv",index=False)

step4までの処理が一通り完了すると、jsonl形式のデータはjson形式になってます。step5ではpandasの機能を利用してjson形式のデータをcsv形式のデータに書き換えてあげます。
pandas便利すぎる。。。😍

内容としては以上となります。

この記事が気に入ったらサポートをしてみませんか?