每次需要向文件添加新数据时,您都可以读取、解析和修改文件,如下所示:
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]')
此代码将打开文件,移到 last 之前\n]
,追加,\n
,转储新数据并添加 final \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"]}
]