导入/加载几个大JSON文件的方法

时间:2018-05-31 11:54:16

标签: json python-3.x import

对于Python3。 您如何处理以下问题? (我在其他一些帖子中没有找到这样的东西)

我需要打开/加载72个不同的.json文件,并将它们中的每一个分配给一个变量。像这样:

    import json,
with open('/Users/Data/netatmo_20171231_0000.json') as f:
    d1 = json.load(f)
with open('/Users/Data/netatmo_20171231_0010.json') as f:
    d2 = json.load(f)
with open('/Users/Data/netatmo_20171231_0020.json') as f:
    d3 = json.load(f)
with open('/Users/Data/netatmo_20171231_0030.json') as f:
    d4 = json.load(f)    
with open('/Users/Data/netatmo_20171231_0040.json') as f:
    d5 = json.load(f)
with open('/Users/Data/netatmo_20171231_0050.json') as f:
    d6 = json.load(f)
with open('/Users/Data/netatmo_20171231_0100.json') as f:
    d7 = json.load(f)
with open('/Users/Data/netatmo_20171231_0110.json') as f:
    d8 = json.load(f)
with open('/Users/Data/netatmo_20171231_0120.json') as f:
    d9 = json.load(f)
with open('/Users/Data/netatmo_20171231_0130.json') as f:
    d10 = json.load(f)

但我不想(也认为效率低下)执行72次。 最后我将创建一个pandas数据帧,但首先我需要变量中的json(s),因为我将一个函数应用于它们以展平数据(这些Jsons非常嵌套)。

我也尝试成功加入JSON文件,但生成的JSON为5GB,我的PC需要12个小时才能加载。 (所以这不是一个选择)

谢谢,亲切的问候。

2 个答案:

答案 0 :(得分:0)

首先,找出你的瓶颈所在。 如果是在json解码/编码步骤,请尝试切换到ultrajson 我没有对它进行测试,但是你可以改进的一种方法是通过多个过程。

import os
import pandas as pd
from multiprocessing import Pool

# wrap your json importer in a function that can be mapped
def read_json(pos_json):
    return json.load(pos_json)


def main():
    # set up your pool
    pool = Pool(processes=8) # or whatever your hardware can support

    # get a list of file names
    path_to_json = '/Users/Data/'
    file_list = [pos_json for pos_json in os.listdir(path_to_json) if pos_json.endswith('.json')]


    list = pool.map(read_json, file_list)

if __name__ == '__main__':
    main()

答案 1 :(得分:0)

@OzkanSener再次感谢您的回复。并提示。正如你所说,首先我需要识别我的瓶颈。瓶颈在于内存消耗。所以,你建议的方法没有那么多帮助。相反,我做了以下事情:

with open('/Users/Data/netatmo_20171231_0000.json') as f:
d = json.load(f)
data1 = [flatten(i) for i in d]

with open('/Users/Data/netatmo_20171231_0000.json') as f:
d = json.load(f)
data2 = [flatten(i) for i in d]

with open('/Users/Data/netatmo_20171231_0010.json') as f:
d = json.load(f)
data3 = [flatten(i) for i in d]

依此类推,重复使用d变量而不是一直创建新变量。 最后,我只能创建一个大清单:

from itertools import chain
data= list(chain(data1, data2, data3))