[python] Récupératon de données dans un .txt [Fermé]

Messages postés
3
Date d'inscription
jeudi 13 mars 2008
Statut
Membre
Dernière intervention
14 mars 2008
- - Dernière réponse : sebsauvage
Messages postés
33212
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
27 juillet 2019
- 2 juin 2008 à 22:36
Bonjour,
Je suis sur un projet où je souhaite extraire des données d'un fichier texte pour les utiliser sur une page web à l'aide de Karrigell.
Seulement je n'est pas besoin de toutes les informations du fichier et celles que je garde je voudrais pouvoir les séparer.

Par exemple j'ai un fichier texte comme celui-ci :

"donnée 1","donnée2","donnée inutile","donnée3","donnée4"

et je voudrais pouvoir les afficher de la façon suivant :

donnée1 donnée2
donnée3 donnée4
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
33212
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
27 juillet 2019
11316
3
Merci
Pour ce qui est du csv, en effet ça ressemble mais ce que j'ai donnée n'est qu'un exemple, les données que je vais recevoir ce n'est pas moi qui les créées et je ne sais pas encore quel caractère séparera mes données.

Le module CVS permet justement de spécifier le séparateur de son choix.

Attention: lire des fichiers avec séparateur n'est pas aussi simple qu'il n'y paraît (je vous parle d'expérience).
Je vous recommande chaudement l'utilisation du module CVS pour éviter les problèmes.

Exemple d'utilisation (si ton séparateur est |):

import csv
fichier= csv.reader(open("monfichier.dat", "rb"), delimiter='|')
for ligne in fichier:
    print ligne[0], ligne[1]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60379 internautes nous ont dit merci ce mois-ci

kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1304 -
Attention: lire des fichiers avec séparateur n'est pas aussi simple qu'il n'y paraît

Pourquoi? Effectivement moi j'aurais tendance à ne pas utiliser de lib pour faire ça et à utiliser des split. Ca évite quel genre de problème d'utiliser un parser CSV?
sebsauvage
Messages postés
33212
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
27 juillet 2019
11316 > kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
-
Il faut gérer les cas:
- où le délimiteur de champ (,) est présent dans la chaîne (il faut quoter/déquoter correctement les cellules ("))
- où le quoteur de chaîne (") est présent dans les cellules: il faut l'échapper/le déséchapper (" --> "")
- où le séparateur de ligne est présent dans une cellule --> il faut gérer également correctement.

ça devient rapidement délicat, et si ce n'est pas géré correctement, ton programme se prendra les pieds dans le tapis dès que tu importera un fichier csv où un utilisateur a eu le malheur de mettre un retour-chariot dans une cellule.

Exemple de fichier CSV tordu:
http://img516.imageshack.us/my.php?image=00mk3.png

Si tu travaille ça avec des readline() et des split(), t'es mort.
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1304 > sebsauvage
Messages postés
33212
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
27 juillet 2019
-
Ouuh effectivement, merci pour l'info, l'exemple est très parlant :-)
> sebsauvage
Messages postés
33212
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
27 juillet 2019
-
Bonjour,

J'ai moi même un problème dans la lecture des csv avec python.
Je dois lire des fichiers assez lourds (genre 100 000 lignes), et donc mettre print row me fait perdre énormément de temps. Y a t'il d'autres solutions ? Je comptais juste les mettre dans un tableau, mais je n'y arrive pas (enfin, si, j'y arrive, mais APRES les avoir "print"). Y a t'il d'autres voies que de passer par print ?
sebsauvage
Messages postés
33212
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
27 juillet 2019
11316 > baba4444 -
Rien ne t'oblige à faire un print.
Une fois les données lues, tu veux en faire quoi ?
Les écrire dans une base de données ? Le ré-écrire dans un autre format ? Faire des calculs dessus ?

Le print ne sert qu'à afficher à l'écran.
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1304
0
Merci
Salut,

D'abord tu lis ton fichier et tu crées une liste en utilisant la virgule comme séparateur.
Ensuite tu effaces la donnée inutile puis tu affiches comme ceci:
contenu = open("fichier", "r").read()
contenu = contenu.split(",")
#Ici contenu est égal à ["donnée 1","donnée2","donnée inutile","donnée3","donnée4" ]
#On efface la donnée inutile
del contenu[2]
print contenu[0] + contenu[1]
print contenu[2] + contenu[3]
Messages postés
33212
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
27 juillet 2019
11316
0
Merci
On dirait du CSV. Tu devrais utiliser le module CVS de python: http://docs.python.org/lib/module-csv.html
(et ne pas lire et décoder le fichier toi-même.)
Messages postés
3
Date d'inscription
jeudi 13 mars 2008
Statut
Membre
Dernière intervention
14 mars 2008
0
Merci
Merci ça marche. Mais est ce que je peux encore utiliser d'autre attribut comme contenu.readlines() ? parce qu' avec cette solution il me met :

ligne=contenu.readline()
AttributeError: 'list' object has no attribute 'readline'

Pour ce qui est du csv, en effet ça ressemble mais ce que j'ai donnée n'est qu'un exemple, les données que je vais recevoir ce n'est pas moi qui les créées et je ne sais pas encore quel caractère séparera mes données.
Messages postés
3
Date d'inscription
jeudi 13 mars 2008
Statut
Membre
Dernière intervention
14 mars 2008
0
Merci
Merci bien pour toute vos réponses, heureusement je devrais avoir des délimitateur assez simple :p