Проблема и MWE
Я проверил вопросы / ответы относительно того, как загружать .json
файлы, используя dump (s) и загружая . Этот источник (под подзаголовком Пример простой десериализации ) предполагает, что я могу использовать json.load(read_file)
для загрузки каждого .json
файла. Предположим, что у каждого есть примерно 4 гигабайта файлов .json
(полученных из Open SuperNova Catalog ), для которых содержимое одного файла показано внизу этого поста.
Я читал, что порция в сочетании с генераторами / yield
является одним из способов работы с большими наборами данных, но я не уверен, подходит ли это для этого или нет сценарий использования - сколько данных слишком много? Может быть, существует способ объединения данных с помощью jsoni c, и если да, следует ли объединять все данные в виде строк, а затем преобразовывать, или нужно просто добавлять и преобразовывать напрямую?
Я хотел бы иметь один словарь, для которого значения являются массивами, а ключи соответствуют самому внешнему полю. Каков наилучший способ прочитать эти данные в желаемом формате?
Одно поле в .json
ниже - "redshift"
, которое выглядит так:
"redshift": [
{
"value": "0.068139",
"source": "2,4"
}
],
Я бы хотел, чтобы мой последний набор данных был словарем, который выглядит следующим образом:
data = {
"redshift" :
{'value' : ["0.068139", ...],
{'source : ["2,4", ...],
}
Приведенный ниже код использует рекурсивный поиск в каталоге для печати содержимого каждого файла .json
в каталоге.
import os
import json
import fnmatch
import numpy as np
import pandas as pd
class SuperNovaDataBase():
def __init__(self, directory):
super().__init__()
self.directory = directory
self.extension = '.json'
self._data = dict()
@property
def data(self):
return self._data
def load_data(self):
pattern = '*{}'.format(self.extension)
for root, subdirectory, filenames in os.walk(self.directory):
for filename in fnmatch.filter(filenames, pattern):
path = os.path.join(root, filename)
with open(path, 'r') as data_file:
_data = json.load(data_file)
print("\n{}\n".format(_data))
#
directory = '/Users/.../Desktop/SN'
SNDB = SuperNovaDataBase(directory)
SNDB.load_data()
#
Содержимое одного файла
Для примера всех данных, содержащихся в файле .json
, приведенное ниже содержимое взято из первого файла .json
в папке sne-2015-2019-master
из каталога, указанного выше:
{
"<a id=\"ASASSN-15og\">ASASSN-15og</a>": {
"schema": "https://github.com/astrocatalogs/supernovae/blob/d3ef5fc/SCHEMA.md",
"name": "<a id=\"ASASSN-15og\">ASASSN-15og</a>",
"sources": [
{
"name": "2016A&A...594A..13P",
"bibcode": "2016A&A...594A..13P",
"reference": "Planck Collaboration et al. (2016)",
"alias": "1"
},
{
"name": "ATel 7912",
"bibcode": "2015ATel.7912....1B",
"reference": "Brimacombe et al. (2015)",
"url": "http://www.astronomerstelegram.org/?read=7912",
"alias": "2"
},
{
"name": "Transient Name Server",
"url": "https://wis-tns.weizmann.ac.il/",
"alias": "3"
},
{
"name": "Latest Supernovae",
"secondary": true,
"url": "http://www.rochesterastronomy.org/snimages/snredshiftall.html",
"alias": "4"
},
{
"name": "The Open Supernova Catalog",
"bibcode": "2017ApJ...835...64G",
"reference": "Guillochon et al. (2017)",
"secondary": true,
"url": "https://sne.space",
"alias": "5"
}
],
"alias": [
{
"value": "<a id=\"ASASSN-15og\">ASASSN-15og</a>",
"source": "2,4"
},
{
"value": "AT2016dvr",
"source": "2,3,4"
}
],
"claimedtype": [
{
"value": "Ia CSM",
"source": "2,4"
}
],
"comovingdist": [
{
"value": "296.74",
"derived": true,
"u_value": "Mpc",
"source": "1,2,4,5"
}
],
"dec": [
{
"value": "-31:18:45.6",
"u_value": "degrees",
"source": "2,4"
}
],
"discoverdate": [
{
"value": "2015/08/13",
"source": "2,4"
}
],
"discoverer": [
{
"value": "ASAS-SN",
"source": "2,4"
}
],
"lumdist": [
{
"value": "316.955",
"derived": true,
"u_value": "Mpc",
"source": "1,2,4,5"
}
],
"maxabsmag": [
{
"value": "-20.6334",
"derived": true,
"source": "1,2,4,5"
}
],
"maxappmag": [
{
"value": "16.8",
"derived": true,
"source": "2,4,5"
}
],
"maxdate": [
{
"value": "2015/08/12",
"derived": true,
"source": "2,4,5"
}
],
"maxvisualabsmag": [
{
"value": "-18.215",
"derived": true,
"source": "1,2,4,5"
}
],
"maxvisualappmag": [
{
"value": "19.29",
"derived": true,
"source": "3,5"
}
],
"maxvisualband": [
{
"value": "G",
"derived": true,
"source": "3,5"
}
],
"maxvisualdate": [
{
"value": "2016/04/01",
"derived": true,
"source": "3,5"
}
],
"ra": [
{
"value": "03:21:07.44",
"u_value": "hours",
"source": "2,4"
}
],
"redshift": [
{
"value": "0.068139",
"source": "2,4"
}
],
"velocity": [
{
"value": "19733",
"u_value": "km/s",
"source": "5"
}
],
"photometry": [
{
"time": "57246.5",
"magnitude": "16.8",
"u_time": "MJD",
"source": "2,4"
},
{
"time": "57271.4029977",
"band": "G",
"instrument": "Astrometric",
"magnitude": "21.5",
"observer": "Robot",
"telescope": "Gaia",
"u_time": "MJD",
"upperlimit": true,
"source": "3"
},
{
"time": "57479.4879977",
"band": "G",
"e_magnitude": "0.2",
"instrument": "Astrometric",
"magnitude": "19.29",
"observer": "Robot",
"telescope": "Gaia",
"u_time": "MJD",
"source": "3"
}
]
}
}