JSON Lines形式&unicode escapeされたファイルを加工する
はじめに
NLP関連でデータ加工したり、Wikipediaの元データを確認したりすると、unicode escape(\u30a6のような形式)されていることがあって、UTF-8で見たいとか思ったことはありませんか?
ファイルをgrepをできたとしても確認が一切出来ないといったことがありますので。pythonコードでprint文でセットすると日本語表示可能なコンソールには表示されますが、コピペ範囲を間違えるとエラーになったりします。
WikipediaなどはJSON Lines形式?って感じの1行毎が1つのJSON形式データで完結していることが多く、当然インデントも無いので確認する際も非常に困難です。これらを纏めてなんとかって思ってコードを書きました。w
python3 コード
# -*- coding: utf-8 -*-
# unicode_printer.py
#
# Created on: 2021/12/15
# AUTHOR: Reiki Hattori
# Copyright (c) 2021, Anaheim Engineering. All rights reserved.
#
import argparse
import json
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--file", type=str, help="Please set the file name with the full path.")
parser.add_argument("--do_indent", action="store_true", help="")
args = parser.parse_args()
with open(args.file, 'r', encoding="utf-8") as f:
# ファイルをとにかく頭から1行ずつ読み込んで、printする
for line in f:
# line = line.rstrip()
data = json.loads(line)
if args.do_indent :
print(json.dumps(data, ensure_ascii=False, indent=4))
else :
print(json.dumps(data, ensure_ascii=False))
if __name__ == "__main__":
results = main()
非常に簡単だったので、githubにアップしなくてもと思いここに貼り付けます。ライセンスは書いていませんがMITで。
使い方はコードが読める方は不要かと思いますが。
--file:必須パラメタで入力ファイルです
--do_indent:これを指定するとインデント有りでコンソール出力します
「>」でファイルに吐き出してください。この方が使い勝手がいいかなと思ったもので。
一行単位でJSON形式になっていないファイルは対象外です。エラーになります。逆にJSON lines形式では一般的なJSONファイルを扱う場合にエラーになります。
--do_indentパラメタなしで作成し、その後に同一ファイルを--do_indentパラメタで実行すると展開されて便利です。逆は1行単位のJSON形式になっていないので、エラーになります。
製品じゃないので、エラー処理やログ書き出し等の実装は一切していません。wikipedia cirrussearchでの実行例を以下に記載します。
$ python3 unicode_printer.py --file jawiki-20211206-cirrussearch-content.json --do_indent > jawiki-20211206-cirrussearch-content_A.json