BASHおよびjqヘルプを使用してJSONストリームをPythonに解析します。

BASHおよびjqヘルプを使用してJSONストリームをPythonに解析します。

私はPythonコードを書くのはかなり上手ですが、BASHは私にとってはかなり新機能なので、ライブストリーミングJSONファイルからセンサーデータを読み取り、リアルタイムでデータを処理するという目標を達成するには、高レベルのアプローチを選択するためのいくつかのガイドラインが必要です。時間Python。

設定:Ubuntu 18.04を実行するシステムがあります。システムは、一部のセンサーを読み取り、読み取り値をJSONファイルに転送する周辺機器に接続されています。フローを開始するためにディレクトリを作成し、サービスを開始する単純なbashスクリプトを作成しました。

sudo service my_service stop
if [ -d $LOGDIR ]; then
    echo "All data in ws_log will be erased. Continue? [Y/n]: "
    read ans
    if [ "${ans,,}" = "y" ]; then
        sudo rm -Rf $LOGDIR/*
        echo Directory cleared.
    else
        echo Exiting Script
        exit 1
    fi
else
    mkdir $LOGDIR
    echo $LOGDIR Successfully created!
fi

sudo $SERVDIR/my_service --recording-directory $LOGDIR

サービスが実行されると、ロギングが完了すると、ユーザーはCtrl + cを押すようにメッセージを端末に印刷します(したがって、サービスはSIGINTを受信するまで端末をブロックします)。

screenコマンドを使用し、Pythonサブプロセスモジュールを介してコマンドを渡して別の画面で実行しようとしています。しかし、これは複雑に見え、画面コマンドが作業に最適なツールであるかどうかはわかりません。アイデア?

次の質問:JSONファイルの各オブジェクトは、6つのサンプルとタイムスタンプを含むパケットです。ストリーミングJSONファイルは毎秒20回追加されます。 JSONファイルには「[」で始まり、カンマで区切られたJSONオブジェクトが含まれています。問題はストリーミングなので、末尾の「]」がなく、カンマで終わるということです。

これまで、sedを使用してJSONファイルの最後のコンマを「]」に置き換えるこのコマンドを考えました。ジャックJSON オブジェクトを 1 行に 1 つのオブジェクトとして認識し、書式設定する機能です。

sed "$ s/,/]/g" log.json | jq -c '.[]' | tail -F >> simpler_log.txt

ただし、Pythonまたはbashスクリプトで停止するように指示するまで、この行を実行し続けたいと思います。理想的には、tail -fのトレースを使用して、同じ行が2回読み取られるのを防ぎます。この問題をどのように解決するのですか?それとも、この部分を変えるべきですか?

最後の質問:このデータをPythonスクリプトにプッシュ/プルする方法を提案する方法は?

私は解析された行数を計算し、次のように後続の読み取りを実行できると思いました。

pseudo: json.loads(log_file[last_rec_line+1:-1])

しかし、データをPythonに効率的にインポートする方法に関する提案を聞きたいです。

ここにたくさんの内容があることを知っていて、助けていただければ本当にありがとうございます!

編集:以下は、次のようにストリーミングされたlog.json入力の例です。

[{
    "s_data": {
        "data": [
            [
                8555103,
                8461910,
                16777215,
                0
            ],
            [
                8555205,
                8462544,
                16777215,
                0
            ],
            [
                8555096,
                8461902,
                16777215,
                0
            ],
            [
                8555263,
                8462570,
                16777215,
                0
            ],
            [
                8555098,
                8461900,
                16777215,
                0
            ],
            [
                8555281,
                8462483,
                16777215,
                0
            ]
        ],
        "interval_usec": 8333
    },
    "ts": 1570255057513
},
{
    "s_data": {
        "data": [
            [
                8555122,
                8461908,
                16777215,
                0
            ],
            [
                8555274,
                8462550,
                16777215,
                0
            ],
            [
                8555089,
                8461951,
                16777215,
                0
            ],
            [
                8555255,
                8462559,
                16777215,
                0
            ],
            [
                8555081,
                8461911,
                16777215,
                0
            ],
            [
                8555194,
                8462522,
                16777215,
                0
            ]
        ],
        "interval_usec": 8333
    },
    "ts": 1570255057563
},

これは simple_log.txt の出力です。

{"s_data":{"data":[[8556322,8463977,16777215,0],[8555709,8463977,16777215,0],[8556350,8463989,16777215,0],[8555698,8463993,16777215,0],[8556240,8463965,16777215,0],[8555644,8463958,16777215,0]],"interval_usec":8333},"ts":1570492754634}
{"s_data":{"data":[[8556304,8463955,16777215,0],[8555698,8463973,16777215,0],[8556315,8463965,16777215,0],[8555700,8463962,16777215,0],[8556281,8464029,16777215,0],[8555706,8464020,16777215,0]],"interval_usec":8333},"ts":1570492754684}
{"s_data":{"data":[[8556269,8463948,16777215,0],[8555716,8464027,16777215,0],[8556308,8463958,16777215,0],[8555658,8464075,16777215,0],[8556263,8463945,16777215,0],[8555722,8463991,16777215,0]],"interval_usec":8333},"ts":1570492754734}
{"s_data":{"data":[[8556384,8463866,16777215,0],[8555703,8464072,16777215,0],[8556343,8464003,16777215,0],[8555679,8463964,16777215,0],[8556295,8463911,16777215,0],[8555719,8464070,16777215,0]],"interval_usec":8333},"ts":1570492754784}

ベストアンサー1

おすすめ記事