0

私はいくつかのWMIモニタリングを行うことを書いたpythonユーティリティを持っています、データはそのフォーマットで書かれています

例1

CPU = [{'TS':'2013:12:03:30','CPUVALUES':['0','1','15']}]

今、最終的に次のようになるデータを時々更新する必要があります

CPU = [
   {'TS':'2013:12:03:30','CPUVALUES':['0','1','15']},
   {'TS':'2013:14:00:30','CPUVALUES':['0','75','15']}
]

それを達成する方法の提案

ご意見をお聞かせください

ありがとう

4

1 に答える 1

1

新しいデータを追加する必要があるたびに、ファイルを読み取り、解析し、変更することができます。これは次のようになります。

import json

def append(filename, obj):
    with open(filename, 'rb') as f:
        data = json.load(f, encoding='utf-8')
    data.append(obj)
    with open(filename, 'wb') as f:
        json.dump(data, f, encoding='utf-8')

ただし、特に大きなファイルがある場合は、毎回ファイル全体をメモリに読み込み、逆シリアル化し、追加し、再度シリアル化し、書き留める必要があるため、非常に遅くなる可能性があります...

追加の速度が必要な場合は、ファイルに新しいデータを追加するだけで、ちょっとしたハッカーを実行できます。

import io
import json

def append(filename, data):
    with open(filename, 'r+b') as f:
        f.seek(-2, 2)
        f.write(b',\n')
        f.write(b'   ' + json.dumps(data).encode('utf-8'))
        f.write(b'\n]')

このコードは、ファイルを開き、最後の の前に移動し\n]、追加,\nし、新しいデータをダンプし、最後の を追加します\n]。ファイルの最後に改行を入れないように注意する必要があります。しかし、最後に改行が必要な場合は-3、最後の write append に移動するだけb'\n]\n'です。

注:このコードは、UNIX の行末を使用することを前提としています。Windows の行末の場合は、移動と\n.

IPython セッションの例:

In [29]: %%file test.json
CPU = [
   {"TS": "2013:12:03:30", "CPUVALUES": ["0", "1", "15"]},
   {"TS": "2013:14:00:30", "CPUVALUES": ["0", "75", "15"]}
]
In [30]: !cat test.json
CPU = [
   {"TS": "2013:12:03:30", "CPUVALUES": ["0", "1", "15"]},
   {"TS": "2013:14:00:30", "CPUVALUES": ["0", "75", "15"]}
]
In [31]: append('test.json', {'TS':'2013:14:00:30','CPUVALUES':['0','80','15']})
In [32]: !cat test.json
CPU = [
   {"TS": "2013:12:03:30", "CPUVALUES": ["0", "1", "15"]},
   {"TS": "2013:14:00:30", "CPUVALUES": ["0", "75", "15"]},
   {"TS": "2013:14:00:30", "CPUVALUES": ["0", "80", "15"]}
]
于 2013-08-20T20:31:51.537 に答える