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 :

Question bête sur modification basique de CSV


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Par défaut Question bête sur modification basique de CSV
    Bonjour à tous,

    j'ai un fichier CSV très conséquent (plus de 30k lignes et une 20aine de colonnes) pour lequel je souhaite remplacer toutes les virgules par des points, puis le délimiteur qui est ";" en ",".

    J'arrive bien à changer mes virgules en point, mais pas à enregistrer mes valeurs dans un nouveau CSV. Je n'ai aucune erreur, seulement un fichier output.csv créé mais qui reste vide.
    Merci par avance !

    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
     
    import csv
     
    fname = "fichier.csv"
     
    #Ouvrir l'output.csv en écriture (au départ mis en fin de code, mais tenté avant au cas où, pas mieux)
    with open('output.csv', 'w', newline='') as output:
        writer = csv.writer(output, delimiter=',')
     
    #ouverture en lecture du CSV d'entrée
        with open(fname, "r", newline='') as fcsv:
            reader = csv.reader(fcsv, delimiter=';')
    #changement des virgules en point pour chaque item
            for row in reader:
                for item in row:
                    item = str(item)
                    item = item.replace(",",".")
    #print permettant de confirmer que les , sont devenues des .
                print(row)
     
    #tentative d'écriture. J'ai fait aussi sans boucle avec writerows, même résultat
            for row in reader:
                writer.writerow(row)

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

    Relisez votre code!
    La boucle for de la ligne 12 ne se termine que lorsque vous avez rencontré la fin de fichier. A la ligne 22, il n'y a plus rien à lire...
    De plus s'il restait des lignes à lire, elles seraient écrites sans changement.

    je souhaite remplacer toutes les virgules par des points, puis le délimiteur qui est ";" en ",".
    Lire tout le fichier, faire des str.replace, puis écrire le résultat serait bien plus simple.

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

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Par défaut
    Bonjour,

    En effet, j'avais bêtement en tête que je pouvais mettre à jour avec le reader tout mon fichier, que celui-ci restait modifié tant que le programme était lancé, et donc que je pouvais l'écrire en une fois.
    J'ai donc modifié en mettant l'écriture au sein même de la boucle :

    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
    import csv
     
    import csv
     
    fname = "pop2015.csv"
     
    with open('output.csv', 'w', newline='') as output:
        writer = csv.writer(output, delimiter=',')
        with open(fname, "r", newline='') as fcsv:
            reader = csv.reader(fcsv, delimiter=';')
            for row in reader:
                for item in row:
                    item = str(item)
                    item = item.replace(",",".")
                writer.writerow(row)
    Ce qui me permet de bien écrire mes données dans le output.csv, mais elles gardent la virgule plutôt que le point, et là, je ne comprends pas. Il me semblait pourtant que lorsque je passais le code et vérifiais avec un print(row), j'avais des item en '.' plutôt que ',' mais là, ce n'est pas le cas.
    Et je sèche : comment faire ?
    Merci par avance.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par GroFlo Voir le message
    Et je sèche : comment faire ?
    Merci par avance.
    print(row) se contente d'afficher la liste "row" et Python sépare les éléments de cette liste avec des ','.
    .writerow de son côté, utilise le séparateur par défaut d'un fichier CSV (vous ne lui avez pas demandé d'en utiliser un autre).
    Mais tout çà est précisé dans la documentation (et ce chapitre là a même été traduit en français).

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

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    print(row) se contente d'afficher la liste "row" et Python sépare les éléments de cette liste avec des ','.
    .writerow de son côté, utilise le séparateur par défaut d'un fichier CSV (vous ne lui avez pas demandé d'en utiliser un autre).
    Mais tout çà est précisé dans la documentation (et ce chapitre là a même été traduit en français).

    - W
    Merci, mais je crois qu'il y a une mauvaise compréhension de ma demande, je n'ai pas dû être clair : je ne parle pas du séparateur CSV, qui est déjà en ',' car dans mon writer, j'ai bien précisé delimiter=',' mais je souhaite changer les valeurs dans mon CSV, où les flottants sont écrits sous forme de virgule (et sont du coup automatiquement mis entre guillemets par mon writer), alors que je souhaite que ces valeurs soient en flottants avec des points.
    Bref, j'ai des valeurs du type 203,4, je souhaite les modifier en 203.4, d'où mon item.replace(',','.')

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par GroFlo Voir le message
    Bref, j'ai des valeurs du type 203,4, je souhaite les modifier en 203.4, d'où mon item.replace(',','.')
    Ah ben çà, c'est parce que vous avez écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                for item in row:
                    item = str(item)
                    item = item.replace(",",".")
    Vous remplacez les ',' par des '.' dans item mais vous ne touchez pas au contenu de la row... Si vous voulez programmer avec Python, il va falloir prendre le temps d'apprendre les bases.

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

Discussions similaires

  1. [vbexcel]question bête sur l'ouverture d'un fichier xls
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/11/2005, 16h38
  2. question bête sur use
    Par bobymaw dans le forum Langage
    Réponses: 1
    Dernier message: 06/11/2005, 19h34
  3. [VB6]Question bête sur les paramètres optionels
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/10/2005, 20h33
  4. Réponses: 7
    Dernier message: 05/10/2005, 11h29
  5. [MFC] Question bête sur les CListBox
    Par gwendo dans le forum MFC
    Réponses: 1
    Dernier message: 10/08/2005, 16h43

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