对于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个小时才能加载。 (所以这不是一个选择)
谢谢,亲切的问候。
答案 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))