problème traitement fichier CSV avec python

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

J'ai décidé d'essayer de traiter les stats Twitter moi même (depuis les extract qu'ils fournissent en CSV) et j'ai crée un petit script pour commencer (j'ai jamais fait ça donc je teste)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import csv

fichier = "Classeur2.csv"
file = open(fichier, "rb")

try:
    reader = csv.reader(file)
    for row in reader:
        print row[3],row[5]
finally:
    file.close()

Le tout avec un fichier csv qui ressemble à ça (la première ligne): Identifiant du Tweet,"Permalien du Tweet","Texte du Tweet","heure","impressions","engagements","taux d'engagement","Retweets","réponses","J'aime","clics sur le profil de l'utilisateur","clics sur l'URL","clics sur le hashtag","ouvertures des détails","clics sur le permalien","ouvertures d'application","installations de l'application","abonnements ","envoyer le Tweet par email","composer le numéro","vues du média","engagements avec le média","impressions sponsorisé","engagements sponsorisé","taux d'engagement sponsorisé","Retweets sponsorisé","réponses sponsorisé","J'aime sponsorisé","clics sur le profil de l'utilisateur sponsorisé","clics sur l'URL sponsorisé","clics sur le hashtag sponsorisé","ouvertures des détails sponsorisé","clics sur le permalien sponsorisé","ouvertures d'application sponsorisé","installations de l'application sponsorisé","abonnements sponsorisé","envoyer le Tweet par email sponsorisé","composer le numéro sponsorisé","vues du média sponsorisé","engagements avec le média sponsorisé"

et mon problème est que mon code me renvoi une erreur :

Traceback (most recent call last):
File "/home/ubuntu/workspace/python/twitter.py", line 16, in <module>
print row[3],row[5]
IndexError: list index out of range

Alors que pourtant j'ai une colonne 3 et 5 ("texte du tweet" et "impressions")

Vous sauriez pourquoi ça fonctionne pas ?

+0 -0
Staff

Bonjour,

avant toute chose, je ne saurais trop de conseiller d'utiliser with plutôt que try/finally. De plus nommer une variable file n'est pas très conseillé même si python l'autorise. En effet la lib standard possède une fonction qui s'appelle file.

Ensuite, pour s'assurer que tout va bien, il vaudrait mieux donner plus de renseignements au reader : reader = csv.reader(file, delimiter=",", quotechar='"').

Autrement, je ne vois pas le problème.

+1 -0
Staff

Salut,

@artragis : ce sont les valeurs par défaut de delimiter et quotechar

Ton code exemple avec un fichier CSV d'une ligne contenant ce que tu as écrit fonctionne comme attendu chez moi. Par contre, je vois que ton erreur est reportée ligne 16, donc que le code que tu as mis ici n'est pas celui que tu utilises… Est-ce que ça marche avec le code que tu as mis dans ton post ? Si oui, il faudrait montrer le script qui plante pour que l'on puisse t'aider.

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+1 -0
Staff

Dans ce cas, il n'y a pas à chercher midi à quatorze heures, le problème vient du CSV.

Que donne cat -vet sur ton fichier ? (pour afficher les caractères spéciaux et sauts de ligne explicitement)

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+0 -0
Staff

Oh, tu travailles sous Windows ? Je ne pourrais probablement pas t'aider beaucoup plus alors. Est-ce qu'il y a par hasard une ligne vide en début de ton fichier ? Si oui, il faudrait la supprimer, elle produirait un row vide (qui n'a donc aucun élément), responsable de ton erreur.

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+0 -0
Auteur du sujet

Oui sur Windows :s Non je n'ai pas de ligne vide quand j'ouvre le fichier depuis Excel . Faudrait que je test avec Calc au cas ou .

M'enfin bon au pire si ça fonctionne jamais juste je traiterai pas ces données (j'en ai déjà des tonnes avec leur outil de stat)

+0 -0
Staff

Oui sur Windows :s Non je n'ai pas de ligne vide quand j'ouvre le fichier depuis Excel . Faudrait que je test avec Calc au cas ou .

Euh… Un fichier csv, c'est juste un fichier texte… Tu peux l'ouvrir avec Notepad.

Cela dit, tu peux aussi demander à Python d'afficher les lignes les unes après les autres, en remplaçant la ligne print row[3], row[5] par print row. Ça te donnera une idée de ce qu'il lit dans ton fichier.

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+0 -0
Staff

Tout te semble bon, c'est à dire ? Quelle est la sortie exacte à la virgule près ?

I don't mind that you think slowly, but I do mind that you are publishing faster. – W. Pauli

+0 -0
Auteur du sujet

La sortie est (avec un interpréteur python 2 ) :

Traceback (most recent call last):
File "/home/ubuntu/workspace/python/twitter.py", line 9, in <module>
print row[3],row[5]
IndexError: list index out of range

+0 -0
Auteur du sujet

Ça fonctionne ça remonte :

['Identifiant du Tweet,"Permalien du Tweet","Texte du Tweet","heure","impressions","engagements","taux d'engagement","Retweets","r\xe9ponses","J'aime","clics sur le profil de l'utilisateur","clics sur l'URL","clics sur le hashtag","ouvertures des d\xe9tails","clics sur le permalien","ouvertures d'application","installations de l'application","abonnements ","envoyer le Tweet par email","composer le num\xe9ro","vues du m\xe9dia","engagements avec le m\xe9dia","impressions sponsoris\xe9","engagements sponsoris\xe9","taux d'engagement sponsoris\xe9","Retweets sponsoris\xe9","r\xe9ponses sponsoris\xe9","J'aime sponsoris\xe9","clics sur le profil de l'utilisateur sponsoris\xe9","clics sur l'URL sponsoris\xe9","clics sur le hashtag sponsoris\xe9","ouvertures des d\xe9tails sponsoris\xe9","clics sur le permalien sponsoris\xe9","ouvertures d'application sponsoris\xe9","installations de l'application sponsoris\xe9","abonnements sponsoris\xe9","envoyer le Tweet par email sponsoris\xe9","composer le num\xe9ro sponsoris\xe9","vues du m\xe9dia sponsoris\xe9","engagements avec le m\xe9dia sponsoris\xe9"']
['704365293481664513,"https://twitter.com/Le_Moniteur/status/704365293481664513","B\xe2timent intelligent : Hager s'offre la PME fran\xe7aise Azimut Monitoring https://t.co/SCOjhMyUqn https://t.co/V8ZDnYgtLk","2016-02-29 17:59 +0000","1660.0","25.0","0.015060240963855422","8.0","0.0","2.0","1.0","9.0","0.0","3.0","0.0","0","0","0","0","0","2","2","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-"']
['704362060176605184,"https://twitter.com/Le_Moniteur/status/704362060176605184","L'\xe9cole du BIM ouvre en Normandie https://t.co/e5gcozenZX https://t.co/fjhyCjd8nh","2016-02-29 17:46 +0000","2483.0","76.0","0.030608135320177206","15.0","0.0","5.0","2.0","35.0","0.0","8.0","0.0","0","0","0","0","0","11","11","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-"']

+0 -0
Staff
1
2
3
['Identifiant du Tweet,"Permalien du Tweet","Texte du Tweet","heure","impressions","engagements","taux d\'engagement","Retweets","r\xe9ponses","J\'aime","clics sur le profil de l\'utilisateur","clics sur l\'URL","clics sur le hashtag","ouvertures des d\xe9tails","clics sur le permalien","ouvertures d\'application","installations de l\'application","abonnements ","envoyer le Tweet par email","composer le num\xe9ro","vues du m\xe9dia","engagements avec le m\xe9dia","impressions sponsoris\xe9","engagements sponsoris\xe9","taux d\'engagement sponsoris\xe9","Retweets sponsoris\xe9","r\xe9ponses sponsoris\xe9","J\'aime sponsoris\xe9","clics sur le profil de l\'utilisateur sponsoris\xe9","clics sur l\'URL sponsoris\xe9","clics sur le hashtag sponsoris\xe9","ouvertures des d\xe9tails sponsoris\xe9","clics sur le permalien sponsoris\xe9","ouvertures d\'application sponsoris\xe9","installations de l\'application sponsoris\xe9","abonnements  sponsoris\xe9","envoyer le Tweet par email sponsoris\xe9","composer le num\xe9ro sponsoris\xe9","vues du m\xe9dia sponsoris\xe9","engagements avec le m\xe9dia sponsoris\xe9"']                                                                                                                                                              
['704365293481664513,"https://twitter.com/Le_Moniteur/status/704365293481664513","B\xe2timent intelligent : Hager s\'offre la PME fran\xe7aise Azimut Monitoring https://t.co/SCOjhMyUqn https://t.co/V8ZDnYgtLk","2016-02-29 17:59 +0000","1660.0","25.0","0.015060240963855422","8.0","0.0","2.0","1.0","9.0","0.0","3.0","0.0","0","0","0","0","0","2","2","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-"']   
['704362060176605184,"https://twitter.com/Le_Moniteur/status/704362060176605184","L\'\xe9cole du BIM ouvre en Normandie https://t.co/e5gcozenZX https://t.co/fjhyCjd8nh","2016-02-29 17:46 +0000","2483.0","76.0","0.030608135320177206","15.0","0.0","5.0","2.0","35.0","0.0","8.0","0.0","0","0","0","0","0","11","11","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-"']    

alliocha1805

Tu remarques rien ?

Compares ces deux listes python :

1
2
['"a", "b"'] # un élément
["a", "b"]   # deux éléments

Je parle de JavaScript et d'autres trucs sur mon blog : https://draft.li/blog

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

1
2
3
4
5
6
7
8
>>> xs1 = ['"a", "b"']
>>> xs2 = ["a", "b"]
>>> xs1[1]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: list index out of range
>>> xs2[1]
'b'

[EDIT] Pour expliciter ce que ce code démontre : Tu ne peux pas accéder aux éléments placés aux indices 3 et 5 d'une liste qui n'a qu'un seul élément. Dans le code ci-dessus, je créé une liste avec un seul élément et ne peux pas accéder à son second élément parce qu'il n'y a pas de second élément. Puis je créé une liste avec deux éléments et je peux accéder au second élément puisqu'il existe.

Édité par victor

Je parle de JavaScript et d'autres trucs sur mon blog : https://draft.li/blog

+2 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte