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')