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 :

Retraitement de fichier CSV


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut Retraitement de fichier CSV
    Bonjour à tous,

    J'ai écris un code python afin de vérifier la présence de plusieurs fichiers dans un repertoire et qui permet de supprimé les lignes vides de plusieurs fichiers csv. (==> Le code fonctionne très bien)
    Mon souci provient du fait qu'un champ d'un fichier csv contient plusieurs lignes de données et je ne sais pas comment le traiter, peut être un souci d'encodage ? (en effet lorsque j'ouvre le csv avec Excel le champs en question contient un double quote au début (et pas à la fin), et Excel le voit bien comme un champ avec une seule information...
    En l'ouvrant sous python, y'a plusieurs lignes dans le même champs...

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    # Fonction de vérification des fichiers exportés
    def verifier_fichier_export(fichier_parametre, chemin):
        print('**************************************************')
        print('Lancement de la fonction de verification des fichiers')
        print('**************************************************')
        log.info('START Verifier Fichier Export')
        # Depart du timer pour compter le temps d'execution
        depart_timer = time.perf_counter()
        dossier = os.listdir(chemin)
        data = pd.read_excel(fichier_parametre, sheet_name='X', engine='pyxlsb')
        df = pd.DataFrame(data)
        bool_var = False
        for i in df.index:
            fichier = df['Nouveau nom'][i]
            if fichier not in dossier:
                print(f'Le fichier "{fichier}" n est pas présent dans le dossier "{chemin}"')
                log.info('Absence du fichier : ' + fichier + ' dans le repertoire ' + chemin)
                bool_var = True
            else:
                if '.csv' in fichier:
                    #try:
                    csv.field_size_limit(100000000)
                    csv.field_size_limit()
                    file_object = open(chemin + fichier, 'r', encoding="cp437")
                    lines = csv.reader(file_object, delimiter=';', quotechar='"')
                    flag = 0
                    data = []
                    num_ligne = 1
                    # Pour chaque ligne du fichier csv
                    for line in lines:
                        num_ligne = num_ligne + 1
                        # On vérifie si tous les champs sont vides
                        var = 0
                        for obj in line:
                            if ('"' in obj) and (obj.count('"') == 1) and (obj.count(';') > 3):
                                obj = obj.replace('"', '')
                                for el in obj.split(";"):
                                    obj = el
                            if obj == '':
                                var = var + 1
                        # Si tous les champs sont vides alors on ne prends pas la ligne vide
                        if len(line) == var:
                            print("Suppression de la ligne vide numéro", num_ligne, 'du fichier', fichier)
                            flag = 1
                            continue
                        else:
                            data.append(line)
                    file_object.close()
                    if flag == 1:  # if blank line is present in file
                        file_object = open(chemin + fichier, 'w')
                        for line in data:
                            file_object.write(';'.join(line) + "\n")
                        file_object.close()
                    #except Exception as e:
                        #print(e, fichier, num_ligne)
        # On arrête la poursuite du traitement s'il manque des fichiers
        if bool_var == True:
            sys.exit()
            log.info('END Verifier Fichier Export : un ou plusieurs fichiers sont manquants')
            print('Arrêt du programme car un ou plusieurs fichiers sont manquants pour permettre de poursuivre le traitement')
        else:
            # Temps d'execution du programme
            fin_timer = time.perf_counter()
            temps_timer = (fin_timer - depart_timer)
            print('Les fichiers sont tous présents dans le dossier.')
            print(f'Tache terminée en {temps_timer:0.4f} secondes.')
            log.info('END Verifier Fichier Export')
    Merci d'avance pour votre aide.

    GK

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Bonjour,

    sur cette partie de votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        # On arrête la poursuite du traitement s'il manque des fichiers
        if bool_var == True:
            sys.exit()
            log.info('END Verifier Fichier Export : un ou plusieurs fichiers sont manquants')
            print('Arrêt du programme car un ou plusieurs fichiers sont manquants pour permettre de poursuivre le traitement')
    Je placerais le sys.exit() après le print, sinon vous risquez de n'avoir ni print qui s'affiche, ni message dans votre fichier log.

    Sinon, enfin quelqu'un ici que je vois utiliser les f-strings !

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par Ghost0000 Voir le message
    en effet lorsque j'ouvre le csv avec Excel le champs en question contient un double quote au début (et pas à la fin), et Excel le voit bien comme un champ avec une seule information...
    Commencez par vous concentrer sur le problème: ça ne prend que quelques lignes de code.

    Déjà on prend un fichier qui contient ce genre de truc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> f = open('test.csv', newline='')
    >>> f.read()
    'A,B,C\r\nZZ,ZZ,"Toto\nTutu"\r\n'
    >>>
    puis on regarde ce qu'en fait le module CSV:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> list(csv.reader(f))
    [['A', 'B', 'C'], ['ZZ', 'ZZ', 'Toto\nTutu']]
    >>>
    Je retrouve Toto et tutu dans la même colonne séparés d'un \n: je suis content.
    Maintenant avec vos paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> list(csv.reader(f, delimiter=';', quotechar='"'))
    [['A,B,C'], ['ZZ,ZZ,"Toto'], ['Tutu"']]
    >>>
    On se retrouve avec une ligne en trop.

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

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut
    Bonjour,

    Le Toto\Tutu est dans le même champs plus haut, et c'est exactement ce problème que j'ai, mais en pire : plusieurs lignes dans le même champs ...

    En réalité j'ai corrigé le doublequote à la source dans le champs commentaire, ce qui m'a évité de faire le code pour retraité ce cas complexe (cas très rare)

    Merci de votre aide
    Cordialement.

    GK

Discussions similaires

  1. Script retraitement fichier CSV
    Par dbtn89 dans le forum Langage
    Réponses: 1
    Dernier message: 01/06/2016, 20h01
  2. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  3. Mettre a jour BD avec fichier csv
    Par Looping94510 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 07/02/2005, 18h56
  4. Sortir un fichier csv sur base d une requete
    Par Freeman_80 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 12/01/2005, 11h21
  5. Réponses: 2
    Dernier message: 14/05/2004, 12h55

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