J'essaie d'écrire un code qui prend une entrée en tant qu'objets JSON imbriqués multiples (chaque objet est sur une nouvelle ligne) - à partir d'un fichier texte et éventuellement aplatir et les convertir dans un fichier CSV. Le programme que j'ai référencé de - https://towardsdaScience.com/flattening- JSON-Objects-in-Python-F5343C794B10 P> convertissait actuellement une de ces lignes d'objet JSON imbriquées dans le fichier texte et l'écriture au fichier CSV. P> Comment puis-je inclure ce code pour fonctionner avec "N" tels objets de données JSON, tous sur des lignes distinctes dans le fichier texte? p> Voici mon code actuel - P> merci. p> p>
3 Réponses :
Je suppose que la boucle à travers le fichier est tout ce dont vous avez besoin? Ensuite, faites juste: Bien sûr, si vous ne vous souciez pas de l'ordre des données, vous pouvez également utiliser Multi-thread pour accélérer la vitesse, mais je pense que ce n'est pas ce que vous cherchez. pour. p> p>
Merci. J'ai exécuté le code et l'erreur possible est-ce que les charges de retour (FP.Read (), AttributeError: 'str' objet n'a pas d'attribut 'Lecture' même essayé de changer de JSON.load (ligne) sur json.loads (ligne.read ( )) Mais aucune utilisation. Toute suggestion sur la manière de résoudre cette erreur?
Faute de frappe. C'est en fait json.loads (ligne) code> au lieu de json.load (ligne) code>.
Merci Ethan! Avec l'aide de votre code, j'ai proposé une version mise à jour du code qui fonctionne correctement! Je sais que vous avez mentionné multithreading et c'est quelque chose que j'explore maintenant, comme étape suivante. Actuellement, ce code ci-dessous prend environ 1 minute pour traiter 150 ensembles de données qui inclut
Toute suggestion sur la manière dont nous pouvons traiter des milliers de données de données sans qu'il prenne des heures à exécuter? p>
code mis à jour - p>
import pandas as pd
import requests
def flatten_json(y):
out = {}
def flatten(x, name=''):
if type(x) is dict:
for a in x:
flatten(x[a], name + a + '_')
elif type(x) is list:
i = 0
for a in x:
flatten(a, name + str(i) + '_')
i += 1
else:
out[name[:-1]] = x
flatten(y)
return out
data = []
with open('input.txt') as f_input:
for id in f_input:
url = "API_url"
PARAMS = {'param1': id.strip()}
resp = requests.get(url, headers={
'headerkey': 'headervalue'}, params=PARAMS)
flat = flatten_json(resp.json())
df = pd.json_normalize(flat)
data.append(df)
export_csv = pd.concat(data).to_csv(r'output.csv')
Ceci est un exemple rapide de la façon dont vous pouvez y parvenir. Fondamentalement, il créera 4 processus et chaque processus prendra 4 lignes à la fois pour la convertir en JSON.
import json
import pandas as pd
from multiprocessing import Pool
def flatten_json(y):
out = {}
def flatten(x, name=''):
if type(x) is dict:
for a in x:
flatten(x[a], name + a + '_')
elif type(x) is list:
i = 0
for a in x:
flatten(a, name + str(i) + '_')
i += 1
else:
out[name[:-1]] = x
flatten(y)
return out
def parse_line(line):
data = json.loads(line)
flat = flatten_json(data)
return pd.json_normalize(flat)
if __name__ == "__main__":
pool = Pool(4)
with open('foo.txt', 'r') as f:
dfs = pool.map(parse_line, f, 4)
pool.close()
pd.concat(dfs).to_csv('output.csv')