0

我有 python 实用程序,我写了一些 WMI 监控,数据以这种格式写入

示例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]')

此代码将打开文件,移到 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"]}
]
于 2013-08-20T20:31:51.537 回答