0
votes

Existe-t-il un moyen d'élaborer ce programme de traiter plusieurs lignes de JSON?

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

à 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

convertissait actuellement une de ces lignes d'objet JSON imbriquées dans le fichier texte et l'écriture au fichier CSV.

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?

Voici mon code actuel - xxx

merci.


0 commentaires

3 Réponses :


0
votes

Je suppose que la boucle à travers le fichier est tout ce dont vous avez besoin? Ensuite, faites juste: XXX

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.


2 commentaires

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) au lieu de json.load (ligne) .



0
votes

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

  • lecture du fichier li>
  • Faire une demande d'accès à l'API LI>
  • aplatir la réponse JSON imbriquée et li>
  • puis écrivez tout à la fois à un fichier CSV). li> ul>

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


0 commentaires

0
votes

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


0 commentaires