import json
with open (filepath, mode="r+") as file:
file.seek(0,2)
position = file.tell() -1
file.seek(position)
file.write( ",{}]".format(json.dumps(dictionary)) )
这将同时打开reading and writing的文件。然后,它转到文件的结尾(从结尾开始为零字节)以找出文件结尾的位置(相对于文件的开头),最后返回一个字节,在json文件中,这个字节应该表示字符]。最后,它向结构追加一个新字典,覆盖文件的最后一个字符,并保持它是有效的json。它不会将文件读入内存。使用Python 3.4.3中的ANSI和utf-8编码文件以及大小(5gb)的虚拟文件进行测试。
如果还导入了os模块,则为变体:
import os, json
with open (filepath, mode="r+") as file:
file.seek(os.stat(filepath).st_size -1)
file.write( ",{}]".format(json.dumps(dictionary)) )
import json
import os
def append_record(record):
with open('my_file', 'a') as f:
json.dump(record, f)
f.write(os.linesep)
# demonstrate a program writing multiple records
for i in range(10):
my_dict = {'number':i}
append_record(my_dict)
名单可以稍后再汇总
with open('my_file') as f:
my_list = [json.loads(line) for line in f]
如果需要保持文件是有效的json,可以执行以下操作:
这将同时打开reading and writing的文件。然后,它转到文件的结尾(从结尾开始为零字节)以找出文件结尾的位置(相对于文件的开头),最后返回一个字节,在json文件中,这个字节应该表示字符
]
。最后,它向结构追加一个新字典,覆盖文件的最后一个字符,并保持它是有效的json。它不会将文件读入内存。使用Python 3.4.3中的ANSI和utf-8编码文件以及大小(5gb)的虚拟文件进行测试。如果还导入了
os
模块,则为变体:它定义了文件的字节长度,以到达少一个字节的位置(如前一个示例所示)。
如果您不希望实际加载文件,那么使用
json
进行此操作并不是真正正确的方法。你可以使用一个内存映射文件…并且永远不会实际地将文件加载到内存中--一个memmap
数组可以打开文件并在“磁盘上”构建一个数组,而不需要将任何内容加载到内存中。创建dict的内存映射数组:
现在读取数组,而不加载文件:
创建列表时,文件的内容会加载到内存中,但这不是必需的——您可以在磁盘上使用阵列,而不必加载它。
创建一个内存映射数组所需的时间可以忽略不计(例如纳秒),该数组可以索引文件,而不管文件大小(例如100 GB)。
可以使用json转储dict,每行一个。现在每一行都是您编写的一个json dict。您可以松开外部列表,但可以向现有文件添加简单的附加记录。
名单可以稍后再汇总
文件看起来像
相关问题 更多 >
编程相关推荐