我有多个(1000+) JSON文件,每个文件都包含一个JSON数组。我想把所有这些文件合并成一个文件。
我想出了以下内容,它读取这些文件中的每一个,并创建一个包含所有内容的新对象。然后将这个新对象写入一个新文件中。
这种方法有效吗?有没有更好的方法来做到这一点?
head = []
with open("result.json", "w") as outfile:
for f in file_list:
with open(f, 'rb') as infile:
file_data = json.load(infile)
head += file_data
json.dump(head, outfile)
发布于 2015-06-23 00:54:19
head
应该有一个类似于merged_files
的名称,而且您不应该使用f
作为迭代器变量。像json_file
这样的东西会更好。发布于 2016-07-09 13:55:32
这在本质上是阿列克斯兰评论阐明的:
解析和序列化JSON并不是免费的,所以您可能希望避免它。我认为您可以只输出"["
,第一个文件,","
,第二个文件等等,"]"
并将其称为一天。如果所有输入都是有效的JSON,除非我大错特错,否则这也应该是有效的JSON。
在代码中,版本1:
def cat_json(outfile, infiles):
file(outfile, "w")\
.write("[%s]" % (",".join([mangle(file(f).read()) for f in infiles])))
def mangle(s):
return s.strip()[1:-1]
第2版:
def cat_json(output_filename, input_filenames):
with file(output_filename, "w") as outfile:
first = True
for infile_name in input_filenames:
with file(infile_name) as infile:
if first:
outfile.write('[')
first = False
else:
outfile.write(',')
outfile.write(mangle(infile.read()))
outfile.write(']')
第二个版本有一些优点:它的内存需求应该类似于最长输入文件的大小,而第一个版本则需要所有文件大小之和的两倍。同时打开的文件句柄的数量也较小,因此它应该适用于任意数量的文件。
通过使用with
,它也具有确定性(并且是即时的!)离开每个with
块时,文件句柄的解除分配,即使在具有非即时垃圾收集的python实现中(如pypy和jython等)。
https://codereview.stackexchange.com/questions/87254
复制相似问题