各行に、完結(独立)したJSON形式オブジェクト が1件ずつ格納されているファイル(各行末に改行記号なし)を JSONオブジェクト として、Pythonのリストの各要素に 読み込むコード の 書き方

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

【 想定するデータ・ファイル形式 】(例)ログ・ファイル

  • 各行に、1個の完結した(独立した)jsonオブジェクト が 記述されている。
  • 各行の行末 に カンマ はなし

データ・ファイルに空行が含まれている場合、JSONパーサーに食わせる段階でコケる

  • 取り扱うファイル に、空行が含まれない場合(readlinesメソッドで一気に読み込み)
  • 空行含むファイルを扱う場合は、この記事の後段に記載した、readlineメソッドで1行ずつ読み込んで空行判定&除去を行うやり方を紹介します。
Python3
import json
import types

with open('user_access_record.log') as f:
    lines = f.readlines()

# print(type(lines))
## <class 'list'>

# print(len(lines))
# print(lines[0])
  • リストの各要素のデータ型 は、 str型
Python3
print(type(lines[0]))
# <class 'str'> 

1件毎のログデータに、不要なデータ項目が含まれている場合、適宜、除去

  • (例) TAB記号(/t)の前に、不要な文字列が含まれている場合、TAB記号を区切り文字にして、TAB以降のみ取得(各行に、TABは1箇所しか出現しないことが前提)
Python3
cleaned_lines = [line.split('\t')[1] for line in lines]
# print(len(cleaned_lines))
# print(cleaned_lines[0])
  • リストの各要素のデータ型 は、 str型
Python3
print(type(cleaned_lines[0]))
# <class 'str'>
  • json parser で JSONオブジェクト に 変換
Python3
json_encoded_lines = [json.loads(line) for line in cleaned_lines]
# print(len(json_encoded_lines))

print(type(json_encoded_lines))
# <class 'list'>
  • リストの各要素のデータ型 は、 dict型
  • JSON形式 は、Pythonのdict型 と 同じなので、dict型 として 認識される
Python3
print(type(json_encoded_lines[0]))
# <class 'dict'>
Python3
# print(json_encoded_lines[0])
  • json.dumpsメソッド で JSONオブジェクト を見やすい形式で標準出力に表示してくれる
Python3
print(json.dumps(json_encoded_lines[0], sort_keys=True, indent=4))

ログデータ・ファイルに空行が含まれている場合、JSONパーサーに食わせる段階でコケる

readlineメソッドで1行ずつ、空行判定&空行除去するのが賢い

Python3
import json

lines = []

with open('user_access_record.log') as f:
    while True:
        log_line = f.readline()
        if log_line == '':
            break
        line = log_line.split('\t')[1] # TABの前に不要なTimestampがあるので除去
        lines.append(json.loads(line))

Python3
# print(len(lines))
# print(lines[0])

import types
print(type(lines[0]))
# <class 'dict'>

# print(json.dumps(lines[0], sort_keys=True, indent=4))
# print(json.dumps(lines[2000], sort_keys=True, indent=4))