如何将一个JSON文件列表转换成一个巨大的JSON数组?我有5000份文件和55万份清单。
我的第一个尝试是使用jq,但是看起来jq-s并没有针对大的输入进行优化。
jq -s -r '[.[][]]' *.js
这个命令可以工作,但是需要很长时间才能完成,我真的很想用Python解决这个问题。
这是我当前的代码:
def concatFiles(outName, inFileNames):
def listGenerator():
for inName in inFileNames:
with open(inName, 'r') as f:
for item in json.load(f):
yield item
with open(outName, 'w') as f:
json.dump(listGenerator(), f)
我得到:
TypeError: <generator object listGenerator at 0x7f94dc2eb3c0> is not JSON serializable
任何将所有文件加载到ram的尝试都会触发Linux的OOM杀手。你有什么想法吗?
从simplejson 3.8.0开始,您可以使用
iterable_as_array
选项将任何iterable序列化为数组结果是
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
您应该从
list
派生并重写__iter__
方法。结果是
[1, [1, 2, 3], [20, 30, 40]]
。一个完整的简单易读的解决方案,它可以将生成器从普通的或空的iterable序列化,可以与.encode()或.iterencode()一起使用。笔试。使用Python2.7、3.0、3.3、3.6进行测试
使用的解决方案:Vadim Pushtaev(不完整)、user1158559(不必要的复杂)和Claude(在另一个问题中,也很复杂)。
有用的简化是:
__init__
中完成,因为我们可以预期SerializableGenerator可以在json.dumps之前立即调用。(针对用户1158559解决方案)__repr__
这样的方法。最好将生成器也存储到列表中,以提供有意义的结果,如[<generator object ...>]
。(反对克劳德)。默认方法__len__
和__bool__
现在可以正确地识别空对象和非空对象。此解决方案的一个优点是,可以使用标准的JSON序列化程序而无需参数。如果应该支持嵌套生成器,或者不希望使用
SerializableGenerator(iterator)
进行封装,那么我建议使用IterEncoder答案。相关问题 更多 >
编程相关推荐