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 :

fichier csv IndexError: list index out of range [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2017
    Messages : 14
    Par défaut fichier csv IndexError: list index out of range
    Bonjour,

    Je souhaite enregistrer des données dans un fichier csv pour pouvoir les lire après. J'ai 2 programmes pour tester le fonctionnement : un pour écrire dans le fichier, l'autre pour lire le fichier.

    J'arrive à écrire les données dans le fichier csv (visibles dedans). Mais quand je souhaite les lire cela ne fonctionne pas.
    Dans un premier temps, on pourrait se dire qu'il y a une erreur dans le programme de mon fichier lecture. Sauf que lorsque j'enregistre le fichier csv directement à partir d'Open Office, mon fichier lecture fonctionne !


    Fichier écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import csv
    import datetime
     
    Date = ["samedi","dimanche","lundi"]
    Param = ["20","40","10"]
     
    valeur = 40
    fichierCSV = open("base.csv","w",encoding='utf-8')
    ContenuCSV = csv.writer(fichierCSV)
    date = datetime.datetime.now()
    ContenuCSV.writerow([ ( str(date.day) + "." + str (date.month) + "." + str(date.year) + " " + str(date.hour) + ":" + str(date.minute) + ":" + str(date.second) ) , valeur ])
    ContenuCSV.writerow([ Date[1] , Param[1] ])
    ContenuCSV.writerow([ Date[0] , Param[0] ])
    fichierCSV.close()

    Fichier lecture :

    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
    fichierCSV = open("base.csv","r",encoding='utf-8')
    ContenuCSV = csv.reader(fichierCSV,)
    print(ContenuCSV)
    NumLigne = 0
    Date = ["","",""]
    Param = ["","",""]
    for ligne in ContenuCSV:
        NumLigne = NumLigne + 1
        print (NumLigne-1)
        Date[NumLigne-1]= ligne[0]
        Param[NumLigne-1]= ligne[1]
     
        print (Date)
        print (Param)
    Affichage dans le shell :

    <_csv.reader object at 0x0322D0F0>
    0
    ['16.12.2018 18:8:38', '', '']
    ['40', '', '']
    1
    Traceback (most recent call last):
      File "C:\Users\Anthony\Desktop\HTML CSS\CSV\CSV.py", line 11, in <module>
        Date[NumLigne-1]= ligne[0]
    IndexError: list index out of range
    Merci pour votre aide.

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

    A priori, un fichier CSV est un ensemble de lignes représentant un même nombre de colonnes.
    Revoyez l'écriture de votre fichier, il y a 3 .writerow qui écrivent un nombre de colonnes différents. Comment s'y retrouver à la lecture sinon avec un IndexError?

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

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2017
    Messages : 14
    Par défaut
    Mon fichier csv comprend 2 colonnes 3 lignes.
    Mon programme récupère les valeurs dans les listes pour les écrire en colonne.
    Il y a 3 valeurs dans deux listes ce qui au bout du compte donne un fichier csv avec 2 colonnes et 3 lignes (ce que j'obtiens lorsque j'ouvre le fichier).

    Lorsque je lis le fichier ligne par ligne, je récupère les 2 valeurs ligne[0] et ligne[1] pour les remettre dans les listes.
    Ce fichier fonctionne quand je l'utilise avec un fichier csv 2 colonnes 3 lignes directement enregistré à partir d'Open Office.

    Merci pour votre aide.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Citation Envoyé par toto17 Voir le message
    Lorsque je lis le fichier ligne par ligne, je récupère les 2 valeurs ligne[0] et ligne[1] pour les remettre dans les listes.
    Certes mais si Python vous dit IndexError, il a (ses bonnes) raison(s).... et il n'y a que vous pour faire un "print (ligne)" avant d'essayer d'en tirer ligne[0], ligne[1]

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

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par toto17 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Date = ["","",""]
    Param = ["","",""]
    for ligne in ContenuCSV:
        NumLigne = NumLigne + 1
        print (NumLigne-1)
        Date[NumLigne-1]= ligne[0]
        Param[NumLigne-1]= ligne[1]
     
        print (Date)
        print (Param)
      File "C:\Users\Anthony\Desktop\HTML CSS\CSV\CSV.py", line 11, in <module>
        Date[NumLigne-1]= ligne[0]
    IndexError: list index out of range
    Bonjour

    "ligne" contient une ligne du fichier. T'as pensé à ce qui se passe si t'as une ligne vide ?

    Par ailleurs incrémenter NumLigne en début de boucle pour travailler ensuite durant tout le corps de boucle sur NumLigne - 1 (outre que c'est complètement idiot) est le meilleur moyen de se planter. Surtout que tu as enumerate() qui te permet de mettre en parallèle un compteur et un contenu...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (NumLigne, ligne) in enumerate(ContenuCSV):
        print(NumLigne, ligne)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2017
    Messages : 14
    Par défaut
    Je tiens tout d'abord à vous remercier pour l'attention que vous portez sur mon sujet.

    Je voudrai remettre tout d'abord ce programme dans son contexte. Je ne suis pas développeur mais enseignant. Ce programme, je ne l'aurai pas écrit de cette manière si je l'avais réalisé dans un but personnel.
    L'objectif étant de voir les incrémentations de variables, les listes et boucle for pour des lycéens débutants en programmation. Et tout cela dans l'utilisation d'un fichier csv pour comprendre comment stocker des données.
    Ce programme est, je le reconnais, bricolé, mais compréhensible pour les élèves.

    Revenons au programme. Je vous ai mis le code avec mes commentaires.

    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
     
    import csv
     
    #ouverture du fichier csv
    fichierCSV = open("base.csv","r",encoding='utf-8')
    # ContenuCSV contient les données du fichier csv
    ContenuCSV = csv.reader(fichierCSV,)
     
    NumLigne = 0
    #création de 2 listes avec des champs vides placées à l'intérieur
    Date = ["","",""] #première liste contient les données de la première colonne
    Param = ["","",""] #deuxième liste contient les données de la deuxième colonne
     
    # boucle qui lit ligne par ligne
    for ligne in ContenuCSV:
        #compteur incrémentant de 1 à chaque saut de ligne
        NumLigne = NumLigne + 1
        print (ligne)
        #Remplace les valeurs de la liste Date par les valeurs 
        #de la première donnée de la ligne (donc première colonne)
        Date[NumLigne-1]= ligne[0]
        #Remplace les valeurs de la liste Param par les valeurs 
        #de la deuxième donnée de la ligne (donc deuxième colonne)
        Param[NumLigne-1]= ligne[1]
     
    print (Date)
    print (Param)
    A partir d'un fichier venant d'Open Office :

    16/12/2018 09:34,40
    16/12/2018 09:40,60
    16/12/2018 09:52,30

    Cela fonctionne, j'obtiens dans le shell :

    ['16/12/2018 09:34', '40']
    ['16/12/2018 09:40', '60']
    ['16/12/2018 09:52', '30']
    ['16/12/2018 09:34', '16/12/2018 09:40', '16/12/2018 09:52']
    ['40', '60', '30']

    Je ne pense donc pas que cela vienne de mon fichier lecture mais plutôt écriture.

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2017
    Messages : 14
    Par défaut
    Je viens de remarquer que le fichier écriture saute des lignes.
    Cela n'est pas visible quand je l'ouvre avec le bloc note.
    Je viens de m'en apercevoir quand j'ai fait un copier coller du résultat.

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

    Citation Envoyé par toto17 Voir le message
    L'objectif étant de voir les incrémentations de variables, les listes et boucle for pour des lycéens débutants en programmation. Et tout cela dans l'utilisation d'un fichier csv pour comprendre comment stocker des données.
    Si c'est pour la pédagogie, pourquoi utiliser le module CSV? Écrire des colonnes séparées par des ',' se fait très bien avec ','.join(...) et le découpage de la ligne s'obtient avec ligne.split(',') - modulo la gestion de fin de ligne.
    Si vous partez à utiliser un module, il faut d'abord lire son mode d'emploi qui raconte:
    csv.writer(csvfile, dialect='excel', **fmtparams)

    Return a writer object responsible for converting the user’s data into delimited strings on the given file-like object. csvfile can be any object with a write() method. If csvfile is a file object, it should be opened with newline=''.
    ce qui explique les lignes vides...

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

  9. #9
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2017
    Messages : 14
    Par défaut
    A vrai dire c'est pas la première que j'utilise des programmes pour écrire dans des fichiers. Et j'ai jamais eu ce problème auparavant. Donc on s'attend pas à cela.

    Le CSV est demandé dans le nouveau programme (de l'éducation nationale).
    Merci pour le temps consacré à mon problème.

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

Discussions similaires

  1. IndexError: List index out of range
    Par SmoZy dans le forum Général Python
    Réponses: 1
    Dernier message: 11/01/2018, 20h54
  2. IndexError: list index out of range
    Par Ouled dans le forum Général Python
    Réponses: 2
    Dernier message: 25/05/2017, 18h58
  3. Tache cron IndexError: list index out of range
    Par rene2200 dans le forum Général Python
    Réponses: 3
    Dernier message: 20/11/2009, 14h02
  4. un impossible "list index out of range" alors que si !
    Par guiguizekid dans le forum Général Python
    Réponses: 3
    Dernier message: 18/05/2008, 04h04
  5. list index out of range
    Par watcha2020 dans le forum Général Python
    Réponses: 2
    Dernier message: 29/06/2006, 09h59

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