IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Fusionner divers fichiers dans un autre format


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Fusionner divers fichiers dans un autre format
    Bonjour à tous,
    je débute en python (vraiment le tout début), excusez-moi si je n'ai pas le parfait vocabulaire.
    J'ai une centaine de fichier JSON contenant des posts sur internet ainsi que les commentaires associés à ces posts. J'aimerais les découper en deux tables "post.csv" et "comment.csv", et fusionner ensemble les cent fichiers. On m'a aidé pour le script permettant de découper le fichier JSON et d'inclure les données dans les deux tables, mais je ne vois pas comment je peux faire pour ajouter les données issues des autres fichiers JSON :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    import json
    import csv
    import sys
     
    json_filename = sys.argv[0] # je ne sais pas à quoi sert cette ligne
     
    # Chargement des données
    with open("fiche1.json", "r") as read_file:
        data = json.load(read_file)
     
    # Extraction du post
    with open('posts.csv', 'w', newline='') as csvfile:
        fields = ['page_id', 'post_time', 'post_text']
        writer = csv.DictWriter(csvfile, fieldnames=fields, extrasaction='ignore')
        writer.writeheader()
        writer.writerow(data)
     
    # Extraction des commentaires
    with open('comments.csv', 'w', newline='') as csvfile:
        fields = ['page_id', 'user_name', 'comment_text']
        writer = csv.DictWriter(csvfile, fieldnames=fields)
        writer.writeheader()
        for comment in data['comment']:
            comment['page_id'] = data['page_id']
            writer.writerow(comment)
    est-ce que l'un.e de vous aurait une idée ? Quelque chose de pas trop compliqué pour quelqu'un qui débute ? Sachant que les fichiers JSON ont des noms assez différents les uns des autres.
    Merci beaucoup d'avance

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 872
    Points : 3 716
    Points
    3 716
    Par défaut
    Salut,

    Ce serait bien d'avoir un exemple de fichier json pour tester...

    Sinon votre code semble effectuer le travail seulement pour le fichier fiche1.json...

    Il faudrait faire pareil pour les autres fichiers mais comme il y en a cent il faudrait utiliser une boucle... On aura besoin de connaitre le nom des fichiers, si les noms de fichier sont tous de la forme ficheN où N est le numéro du fichier, on peut s'en sortir sinon ça doit être possible de lire tous les fichiers d'un dossier sans connaitre leur nom...

  3. #3
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 872
    Points : 3 716
    Points
    3 716
    Par défaut
    Re-salut,

    J'ai essayé de comprendre votre code pour l’adapter (j'ai essayé de deviner le contenu des fichiers json d’après ce j'ai compris du code)...

    C'est un code de débutant (d'autres l'optimiseront peut-être) mais il fonctionne bien chez moi :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import glob
    import os
    import json
    import csv
     
     
    liste_fiches_json = glob.glob('./fiches_json/*.json')
     
    csvfile_posts = open('posts.csv', 'w', newline='')
    fields = ['page_id', 'post_time', 'post_text']
    writer_posts = csv.DictWriter(csvfile_posts, fieldnames=fields, extrasaction='ignore')
    writer_posts.writeheader()
     
    csvfile_comments = open('comments.csv', 'w', newline='')
    fields = ['page_id', 'user_name', 'comment_text']
    writer_comments = csv.DictWriter(csvfile_comments, fieldnames=fields)
    writer_comments.writeheader()
     
     
    for fiche in liste_fiches_json:
     
        with open(fiche, "r") as read_file:
            data = json.load(read_file)       
     
            writer_posts.writerow(data)
     
            for comment in data['comment']:
                comment['page_id'] = data['page_id']
                writer_comments.writerow(comment)
     
    csvfile_posts.close()
    csvfile_comments.close()

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Salut !
    Merci beaucoup de m'aider, je vais essayer votre code. Je ne peux pas mettre un fichier JSON car comme il y a des noms et prénoms je trouve que c'est identifiant, en revanche j'ai "nettoyé" un des fichiers pour l'exemple, ça donne ça (mais en plus volumineux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"page_id": "222778774519444", "post_time": "Yesterday at 14:46", "post_text": "Essai de texte", "comment": [{"user_name": "Prenom1 Nom1", "comment_text": "Commentaire1"}, {"user_name": "Prenom2 Nom2", "comment_text": "Commentaire2"}]}
    Les fichiers ne se nomment pas tous pareil, j'avais mis "Fiche1" pour que ça soit plus compréhensible mais en fait on est plutôt sur des noms comme "postid_164950971831842" qui ne se suivent pas.
    Je regarde votre code et je vous dit, merci en tout cas !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Du coup j'ai essayé le code, la boucle me renvoie ce message d'erreur :

    Traceback (most recent call last):
    File "<pyshell#17>", line 7, in <module>
    writer_comments.writerow(comment)
    File "C:\Program Files\Python37\lib\csv.py", line 155, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
    File "C:\Program Files\Python37\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
    UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f609' in position 320: character maps to <undefined>


    Les deux tables en csv sont bien créées, mais comment.csv n'a que la ligne des noms de variables et posts.csv a une ligne d'information. J'ai essayé en modifiant "fiche" par "postid" en me disant qu'il ne trouvait sans doute pas les fichiers, mais ça ne fonctionne pas non plus. Je suis sure que c'est un truc tout bête mais je débute complètement.

    Une idée ?

    merci !

  6. #6
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 872
    Points : 3 716
    Points
    3 716
    Par défaut
    Ben je viens de tester à nouveau et chez moi cela fonctionne bien...

    Citation Envoyé par Curbice Voir le message
    J'ai essayé en modifiant "fiche" par "postid" en me disant qu'il ne trouvait sans doute pas les fichiers, mais ça ne fonctionne pas non plus.
    Ben non "fiche" représente un élément de liste_fiches_json dans la boucle for fiche in liste_fiches_json:...

    Et dans le code je suppose que les fichiers json sont dans le répertoire fiches_json : liste_fiches_json = glob.glob('./fiches_json/*.json')...

    On peut changer le nom et le chemin du répertoire mais pour tester vous pouvez "créer" un répertoire fiches_json et mettre tous vos fichiers json dedans...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Je ne comprends pas, j'ai utilisé exactement le même code, juste en modifiant les chemins d'accès aux fichiers. La seule différence que je vois c'est qu'il y a d'autres variables que je n'utilise pas et qui sont présentes dans les fiches json (mais que je n'avais pas inclu dans mon exemple), mais j'imagine que ça ne peux pas être ça le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    from os import chdir
    chdir("C:/.../fiches_json")
     
    import glob
    import os
    import json
    import csv
     
    liste_fiches_json = glob.glob('C:/.../fiches_json/*.json')
     
    csvfile_posts = open('posts.csv', 'w', newline='')
    fields = ['page_id', 'post_time', 'post_text']
    writer_posts = csv.DictWriter(csvfile_posts, fieldnames=fields, extrasaction='ignore')
    writer_posts.writeheader()
     
    csvfile_comments = open('comments.csv', 'w', newline='')
    fields = ['page_id', 'user_name', 'comment_text']
    writer_comments = csv.DictWriter(csvfile_comments, fieldnames=fields)
    writer_comments.writeheader()
     
     
    for fiche in liste_fiches_json:  
        with open(fiche, "r") as read_file:
            data = json.load(read_file)        
            writer_posts.writerow(data) 
            for comment in data['comment']:
                comment['page_id'] = data['page_id']
                writer_comments.writerow(comment)
     
    csvfile_posts.close()
    csvfile_comments.close()

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Salut,

    Citation Envoyé par Curbice Voir le message
    (mais que je n'avais pas inclu dans mon exemple), mais j'imagine que ça ne peux pas être ça le problème.
    Relisez le message d'erreur, le problème ne vient pas du code mais des données contenues dans un ou plusieurs fichiers JSON qu'on semble pouvoir lire mais pas écrire. A partir de là, il faut trouver un de ces fichiers, réfléchir au pourquoi de ces données et voir comment les traiter.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Merci pour votre réponse. Effectivement les fichiers json représentent des posts sur internet (parfois des images et dans ce cas c'est du html), et dans les commentaires il y a des smileys, mais je pensais que comme le tout se retrouvait entre guillemets alors ça passait comme du texte et que ça ne pouvait pas poser de problèmes. Visiblement je me suis trompée, est-ce qu'il y aurait une solution relativement simple pour lui permettre de le réécrire comme du texte ?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Citation Envoyé par Curbice Voir le message
    Visiblement je me suis trompée, est-ce qu'il y aurait une solution relativement simple pour lui permettre de le réécrire comme du texte ?
    Dans la police de caractères cp1252 on ne sait pas représenter des caractères hors de 0..255.
    Or \U0001f609 çà fait 128521 en décimal...
    Pour coder çà il faut de l'utf-8/utf-16/... et le préciser à l'open des fichiers (en écriture) via open(...., encoding='utf-8').
    Cependant, ce n'est peut être pas ce qu'il y a de mieux à faire : çà dépend de ce qu'on fait avec les fichiers après.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Pour coder çà il faut de l'utf-8/utf-16/... et le préciser à l'open des fichiers (en écriture) via open(...., encoding='utf-8').
    C'est super ça fonctionne parfaitement, merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir un fichier .jar dans un autre format.
    Par Strappal dans le forum Java ME
    Réponses: 2
    Dernier message: 29/06/2006, 20h32
  2. [xslt] import d'1 fichier dans un autre
    Par teophil dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/11/2005, 09h28
  3. Déplacer un fichier dans un autre répertoire
    Par t_om84 dans le forum Général Python
    Réponses: 2
    Dernier message: 16/05/2005, 10h36
  4. Réponses: 2
    Dernier message: 02/07/2004, 14h46
  5. [LG]Ecrire le contenu d'un fichier dans un autre
    Par lucke dans le forum Langage
    Réponses: 10
    Dernier message: 26/04/2003, 21h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo