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