lecture/écriture fichier texte et conversion en données numériques - Python - Programmation
Marsh Posté le 13-07-2009 à 11:16:54
cilouu a écrit : Bonjour, |
Pfff qu'est-ce que tu te compliques la vie !!!
Code :
|
Marsh Posté le 13-07-2009 à 21:06:54
Peut être .. mais là le compilateur me répond qu'un entier est requis .
Comment résoudre le problème ?
Marsh Posté le 14-07-2009 à 10:43:39
cilouu a écrit : Peut être .. mais là le compilateur me répond qu'un entier est requis . |
Donne un exemple réel de ton fichier. Parce qu'en traitant l'exemple que t'as donné au début, à savoir "1,75892 135,89526 54,8560" ça marche parfaitement...
Marsh Posté le 14-07-2009 à 10:52:08
Sans savoir le python, juste regardant ce que fait la ligne de Sve@r, tu peux comprendre d'où vient le problème.
Le système de Sve@r fonctionne uniquement (tel quel) si tes nombres sont séparés par un seul espace, sinon ça crée des cases vides dans le tableau et Float crie.
Donc soit tu t'assures que dans ton fichier, ce ne soit pas le cas. Soit tu changes un peu la ligne pour qu'elle remplace les suistes de plusieurs espaces par un seul ..
Marsh Posté le 14-07-2009 à 20:01:41
J'ai vérifié et il y a un seul espace, certains nombres sont relatifs mais float les prend en compte, et sa ne marche toujours pas !
J'ai toujours le même message d'erreur à la ligne 6. Alors je dois vraiment pas être douée
1. # chemin du fichier
2. from os import *
3. chdir('E:\dossier')
4. import numpy, csv
5. # nom du fichier
6. fp=open("test.txt","r" )
7. for line in fp:
8. tabNbr=[float(n) for n in line.replace(",","." ).split(" " )]
9. print tabNbr
10. fp.close()
Marsh Posté le 15-07-2009 à 00:13:54
haha le bug vicieux...
vire les 5 premières lignes et mets le chemin complet dans le open
Marsh Posté le 15-07-2009 à 00:56:34
Si j'enlève les 5 premières lignes et que je met seulement
fp=open("E:\dossier\test.txt","r" ), cela ne fonctionne pas non plus.
Alors ce bug
Merci à tous ceux qui ont posté ou posteront une réponse
Marsh Posté le 15-07-2009 à 01:17:18
Alors c'est bon, tout cela m'écrit une série de listes avec les valeurs converties lorsque le script est enregistré dans le même répertoire que le fichier lu. Je n'aurais qu'a créer une boucle pour écrire une liste avec le nombre de données totales du fichier texte (car avec la méthode de Sve@r, ma liste est à chaque fois écrasé par la suivante.
Maintenant je voudrais modifier le fichier source pour pouvoir l'exploiter, et malgré de nombreuses explications sur les forums je n'arrive pas à savoir excatement comment écrire (pour remplacer les données) dans le fichier source. Selon vous, est ce préférable de passer par la méthode csv, et quels sont les bonnes astuces ?
Sinon avez vous une méthode à me proposer ?
Marsh Posté le 18-07-2009 à 23:06:00
Re bonjour !
J'aimerais ouvrir plusieurs fichiers texte à la suite et y écrire les résultats des calculs que j'ai effectué ( données autres que des chaines ). Comment m'y prendre ?
Merci
Marsh Posté le 18-07-2009 à 23:18:12
esox_ch a écrit : Sans savoir le python, juste regardant ce que fait la ligne de Sve@r, tu peux comprendre d'où vient le problème. |
J'y avais pensé également lorsque j'ai vu son post parlant de l'erreur. Mais comme son exemple ne montrait qu'un seul espace entre les nombres, je me suis dit "non ça doit pas être ça" d'où ma demande d'un exemple plus précis
cilouu a écrit : Alors c'est bon, tout cela m'écrit une série de listes avec les valeurs converties lorsque le script est enregistré dans le même répertoire que le fichier lu. Je n'aurais qu'a créer une boucle pour écrire une liste avec le nombre de données totales du fichier texte (car avec la méthode de Sve@r, ma liste est à chaque fois écrasé par la suivante. |
Ben évidemment. Il n'y a qu'un seul tabNbr. Mais rien ne t'empêche d'écrire les lignes du second fichier dans la boucle.
cilouu a écrit : Maintenant je voudrais modifier le fichier source pour pouvoir l'exploiter, et malgré de nombreuses explications sur les forums je n'arrive pas à savoir excatement comment écrire (pour remplacer les données) dans le fichier source. Selon vous, est ce préférable de passer par la méthode csv, et quels sont les bonnes astuces ? |
Un principe de base => la modification d'un fichier implique
- son ouverture
- sa lecture
- une réécriture soit dans le même (en gérant un indice de la position lue et un indice de la position écrite et en jouant avec des déplacement d'une position à l'autre) soit dans un autre
- sa fermeture (et éventuellement de l'autre). Et si il y a eu écriture dans un second fichier, alors effacement du premier et renommage du second
cilouu a écrit : Re bonjour ! |
Question bizarre (ou mal formulée). Tu veux ouvrir plusieurs fichiers textes et y écrire, dans chacun, les mêmes infos, infos issues de traitement tels que calculs ???
Bon, admettons. Alors 2 façons de faire
1) une boucle de lecture sur chaque fichier à écrire
2) pour chaque fichier, faire
a) ouvrir fichier
b) exécuter traitement
c) écrire résultat dans fichier
d) fermer fichier
Concrètement, c'est nul. Si le traitement est long, le temps sera multiplié par le nombre de fichiers
1) faire le traitement et écrire son résultat dans un fichier de base
2) recopier le fichier de base dans tous les autres
Personnellement, je sais quelle méthode je prendrais. Mais bon, moi ça ne m'est jamais arrivé de devoir écrire plusieurs fichiers avec les mêmes résultats....
Marsh Posté le 18-07-2009 à 23:26:47
Non ce serait plutot une synthèse des résultats que je souhaiterais écrire dans un fichier texte qui s'apellerait synthèse. Je dispose de quelques 66*14 fichiers texte à traiter ... :S
Pour la méthode , je vois un peu la démarche, je commence à m'améliorer en python c'est surtout le code qui me pose problème car je n'ai pas trouvé d'exemple concret qui a fonctionné sur le net et surtout en ce qui concerne les résultats de calculs qui ne sont pas des chaines de caractères ... Tu vois mieux de quoi je parle ?
Marsh Posté le 19-07-2009 à 14:07:48
cilouu a écrit : Non ce serait plutot une synthèse des résultats que je souhaiterais écrire dans un fichier texte qui s'apellerait synthèse. Je dispose de quelques 66*14 fichiers texte à traiter ... :S |
Ah ok. tu veut traiter "n" fichiers textes et écrire le résultat dans un fichier résultat (ou synthèse)
Code :
|
Et si t'as pas la liste des fichiers mais que tu dois les prendre par exemple dans un répertoire, alors tu peux l'avoir de cette façon
Code :
|
Et si tu dois filtrer, parmi les fichiers du répertoire, ceux qui sont fichiers de ceux qui ne le sont pas (qui seraient par exemple eux-mêmes des sous-répertoire) alors tu peux utiliser stat pour ça...
Code :
|
cilouu a écrit : ... surtout en ce qui concerne les résultats de calculs qui ne sont pas des chaines de caractères ... Tu vois mieux de quoi je parle ? |
Ah oui. Tu as un résultat qui vaut par exemple 18 (numérique) et tu ne sais pas comment l'écrire dans un fichier texte (car il faut écrire "18" texte) => pas de pb => fres.write("%d" % resultat)
cilouu a écrit : je commence à m'améliorer en python |
T'as bien raison. C'est un langage que j'adore. Souple, puissant...
Marsh Posté le 19-07-2009 à 14:37:23
Sve@r a écrit :
|
ಠ_ಠ ಠ_ಠ ಠ_ಠ
ಠ_ಠ ಠ_ಠ ಠ_ಠ
ಠ_ಠ ಠ_ಠ ಠ_ಠ
Marsh Posté le 19-07-2009 à 15:20:53
masklinn a écrit : |
Ah ? J'ai dit une connerie
Marsh Posté le 19-07-2009 à 15:20:54
Super, merci beaucoup !!
j'essaye ça demain et je vous en dit plus sur mes difficultées prochaines.
Marsh Posté le 19-07-2009 à 15:29:20
Sve@r a écrit : |
T'en as dit 2:
Marsh Posté le 19-07-2009 à 16:13:17
Tu peut être plus explicite dans le code qu'il faut utiliser ... Pour mémo je ne suis pas informaticienne ou même étudiante en informatique, j'en fais parce que ma filière le doit mais je ne suis pas experte ..
Merci
Marsh Posté le 20-07-2009 à 19:26:41
masklinn a écrit :
|
Ah zut, j'aurais pas dû. Mais qui peut se vanter de connaitre tous les builtin ???
masklinn a écrit :
|
Ah. Là ça m'intéresse car j'apprends un truc nouveau. Ainsi, un "for x in [a, b, c, d]" est préférable à un "for x in (a, b, c, d)" ???
cilouu a écrit : Tu peut être plus explicite dans le code qu'il faut utiliser ... Pour mémo je ne suis pas informaticienne ou même étudiante en informatique, j'en fais parce que ma filière le doit mais je ne suis pas experte .. |
De quel code parles-tu ?????? J'ai donné 3 petits bouts de code chacun destiné à effectuer une action précise correspondant à tes problèmes pris individuellement...
Marsh Posté le 20-07-2009 à 19:42:13
Sve@r a écrit : Ah. Là ça m'intéresse car j'apprends un truc nouveau. Ainsi, un "for x in [a, b, c, d]" est préférable à un "for x in (a, b, c, d)" ??? |
Ouip, c'est plus clair et plus cohérent avec les utilisations de tuples en dehors de Python.
Marsh Posté le 20-07-2009 à 19:52:10
MErci beaucoup Messieurs, n'ayant pas accès à internet là ou je bosse, j'aurais besoin de vous pour une erreur qui en une après midi m'a laissé perplexe :
exceptions import error : cannot import name Artist
Marsh Posté le 20-07-2009 à 19:59:30
Est ce que cette partie peut donnier lieu à cette erreur ??
import numpy
from pylab import *
from matplotlib import pyplot as plt
from os import *
chdir("C:\Dossier\test" )
Marsh Posté le 20-07-2009 à 20:36:53
cilouu a écrit : MErci beaucoup Messieurs, n'ayant pas accès à internet là ou je bosse, j'aurais besoin de vous pour une erreur qui en une après midi m'a laissé perplexe : |
Je ne vois pas. Mais généralement, quand tu as une erreur en Python, ça te remonte la pile des appels.
Tu vois donc la ligne qui génère l'exception (et le nom du module aussi) et aussi le module et la ligne qui a appelé le module précédent et le module qui a appelé le module précédent etc etc jusqu'au module principal (celui qui contient "__main__" ).
Donc tu devrais donner au-moins l'instruction qui a engendré ce problème...
cilouu a écrit : Est ce que cette partie peut donnier lieu à cette erreur ?? |
Ta commande chdir est mal formulée. Il faut mettre les séparateurs de chemin à la norme Unix, même si on bosse sous zindow. Ca évite les problèmes de compatibilité
Code :
|
Les autres lignes ne posent pas de problème, pour peu que tu aies installé les modules importés. Mais tu peux aussi ouvrir une fenêtre de travail Python et taper ces instructions une à une voir si elles passent...
Marsh Posté le 20-07-2009 à 20:55:33
Sve@r a écrit : |
Ou alors utiliser des rawstrings, ou doubler ses escapes, ou utiliser os.path.join
Marsh Posté le 20-07-2009 à 21:07:01
Une question sur l'appel des modules .
J'ai rangé mes fonction et le programme princpale dans le même module. Quel est l'écriture à adopter pour ranger ses fonctions dans différents modules et les appeler dans le main ?
Merci
Marsh Posté le 21-07-2009 à 22:19:17
cilouu a écrit : Une question sur l'appel des modules . |
Il faut que, dans le dossier où tu ranges tes modules, tu aies un fichier "__init__.py". C'est impératif.
Ensuite, tu crées tes différents sources qui contiennent tes différentes fonctions. Tu crées donc un fichier "toto.py", un fichier "titi.py" et un fichier "tutu.py"
Te reste plus qu'à importer tout ça
Code :
|
Ensuite, les fonctions définies dans "toto.py" seront préfixées par "toto". Exemple: t'as une fonction "def machinTruc()" ben tu l'appelles par "toto.machinTruc()".
Ou alors tu l'importes dans le namespace principal
Code :
|
Et ensuite, tu peux appeler ta fonction par son simple nom sans la préfixer par "toto" => machinTruc() (ça peut être dangereux si tu redéfinis plusieurs fonctions toutes appelées "machinTruc" dans tes sources ou même si tu redéfinis une fonction déjà existante...)
Si tes fichiers "toto.py", "titi.py" et "tutu.py" sont dans un dossier "dependance" (par exemple), alors tu les importes de cette façon
Code :
|
Ou de celle-là
Code :
|
Ou même
Code :
|
Bien entendu, tu n'oublies pas que le dossier "dependance" doit contenir aussi le fichier "__init__.py"
D'ailleurs ce fichier" __init__.py" est lu dès que tu importes qq chose du dossier "dependance". Tu peux donc très bien lui insérer des ordres Python qui seront exécutés lors de cet import...
Marsh Posté le 22-07-2009 à 22:41:47
J'ai pas bien compris comment fonctionne "_init_.py" . Il se crée automatiquement ?
Et pour l'aide sur une fonction intégré à Python mais présente dans un module, quel ligne il faudrait taper dans l'interpréteur ??
Marsh Posté le 23-07-2009 à 21:46:59
cilouu a écrit : J'ai pas bien compris comment fonctionne "_init_.py" . Il se crée automatiquement ? |
Oui, par magie.
cilouu a écrit : Et pour l'aide sur une fonction intégré à Python mais présente dans un module, quel ligne il faudrait taper dans l'interpréteur ?? |
help(module). Ca t'affichera le contenu du fichier "__init__.py" qui se trouve dans le module "module"....
Marsh Posté le 23-07-2009 à 22:29:34
Super ! Encore un grand merci. Je maitrise de plus en plus ...
Prochaine étape : récupérer dans une matrice max et une matrice min les plus grandes et plus petites valeurs des fichiers pour chaque point donné.
D'autres astuces bien utiles que tu connaisses ?
Marsh Posté le 23-07-2009 à 23:32:19
cilouu a écrit : Super ! Encore un grand merci. Je maitrise de plus en plus ... |
Pour ta matrice ? Tape "matrice python" dans google et t'auras plein de réponse. Par exemple "numpy.matrix" (nécessite le module numpy)...
Marsh Posté le 25-07-2009 à 22:04:09
Re Bonsoir !
Quelle est la meilleure fonction à utiliser pour trier le contenu d'un tableau à n lignes et à 2 colonnes. La colonne 1 doit être trié mais en changeant l'ordre de la colonne 2 (les deux sont liées).
Merci !
Marsh Posté le 26-07-2009 à 00:27:30
cilouu a écrit : Re Bonsoir ! |
Faut pas faire de tableau à 2 colonnes mais créer un objet qui contiendra 2 infos. Il faudra aussi qu'il contienne la méthode "__cmp__()" indiquant comment comparer 2 instances de cet objet (lui et un autre)
Cette méthode devra renvoyer -1 si l'instance courante est plus petite que l'autre instance, 1 si l'instance courante est plus grande et 0 si elles sont égales.
Code :
|
Eventuellement il contiendra aussi la méthode "__str__" renvoyant une chaine représentative de l'objet
Code :
|
Ensuite, tu remplis ton tableau avec "n" lignes d'objet, chaque instance d'objet stockant les 2 infos
Code :
|
Puis, quand tu veux trier ton tableau, tu appelles la méthode sort(). Cette méthode traitera chaque objet par sa méthode __cmp__() et fera elle-même les permutations qui vont bien
Code :
|
Marsh Posté le 26-07-2009 à 13:08:18
Je récapitule ...
Les données que je dois trier sont des données numériques stockées dans les fichiers textes (données décimales à virgules et séparées par des espaces). J'ai donc crée une matrice à 2 colonnes et à n lignes afin d'accéder à ces données et de les manipuler, ce que j'ai bien réussit à faire jusque là. Mais certains de ces fichiers présentent des incohérences, du à leur non continuité (d'ou le tri indispensable).
Il aurait été plus simple apparement de creer un dictionnaire ou classe, mais je ne savais pas comment faire à ce moment là.
Quel est donc l'instruction que je dois écrire pour ranger mes données à partir de mon fichier texte dans une classe CElem ?
Marsh Posté le 26-07-2009 à 13:18:20
une précision supplémentaire : Je dois modifier les données stockées dans la matrice ..
Merci pour vos réponses
Marsh Posté le 26-07-2009 à 13:56:06
cilouu a écrit : J'ai donc crée une matrice à 2 colonnes et à n lignes afin d'accéder à ces données et de les manipuler, ce que j'ai bien réussit à faire jusque là. |
C'est possible. Mais tu ne peux pas les trier (ou alors tu dois implémenter l'algo de tri à la main)
cilouu a écrit : Mais certains de ces fichiers présentent des incohérences, du à leur non continuité (d'ou le tri indispensable). |
Maintenant tu sais. Petit détail: les données d'un dictionnaire ne sont jamais triées. Pire, l'ordre de récupération n'est jamais prévisible. => tab={1 : "hello", 2 : "bye"} => si tu affiches tab.values() rien permet de dire si tu auras "hello" avant ou après "bye"
cilouu a écrit : Quel est donc l'instruction que je dois écrire pour ranger mes données à partir de mon fichier texte dans une classe CElem ? |
Tu parles de mon exemple ? Ben t'as bien vu. La méthode "__init__" attend 2 paramètres qui seront les 2 nombres à stocker => te suffit d'instancier la classe en lui passant 2 nombres
Code :
|
La façon dont tu obtiens ces 2 nombres c'est ton affaire. Si ces nombres viennent d'une ligne texte ben à toi de te débrouiller pour extraire les nombres de la ligne afin de les passer lors de l'appel de la classe.
Maintenant, tu peux très bien aussi faire en sorte de passer une data plus complexe lors de l'appel de la classe et c'est la classe qui se charge de décortiquer la data pour en extraire les nombres. Tout est possible.
Marsh Posté le 28-07-2009 à 20:57:17
C'est assez compliqué surtout vu que j'ai basé tout mon programme sur une matrice et pas une classe (eh oui c'était peut être bête !).
Encore un petit effort pour moi et pour vous ..
Je dois extraire des centre de cercle et des rayons des courbes que j'ai dessiné. J'ai un peu cherché sur le net et il apparaît que la méthode des moindres carrés seraient la meilleure. Cependant je n'arrive pas à savoir comment la résoudre une fois que j'ai posé mes équations de cercles telle que :
(xk - a)² + (yk - b)² - r² = 0 (pour k allant de 1 à n points).
Si l'on prend 10 points, comment initialiser l'algorithme et le résoudre en python sans écriture symbolique mais surement par itération ?
J'ai trois inconnues et n équations donc seulement avec 3 équations je trouve mes inconnues, mais la méthode à utiliser doit-elle être matricielle ?
Merci de vos lanternes !
Marsh Posté le 28-07-2009 à 23:09:32
cilouu a écrit : C'est assez compliqué surtout vu que j'ai basé tout mon programme sur une matrice et pas une classe (eh oui c'était peut être bête !). |
Ben oui. Mais quand c'est bien conçu de façon modulaire ça se change facilement...
cilouu a écrit : Encore un petit effort pour moi et pour vous .. |
C'est plus du Python, c'est des maths. Avec n points, on peut définir une courbe de degré "n - 1". Exemple: la courbe qui passe par 4 points est de degré 3 et se traduit par l'équation ax3 + bx2 + cx + d = 0.
Pour trouver a, b, c et d on peut utiliser la méthode des Pivots de Gauss. C'est con, je m'étais amusé il y a quelques temps à coder l'algo en Python mais je l'ai laissé au bureau.
En revanche, dans ton cas avoir plus de points qu'il n'en faut peut être préjudiciable. Que feras-tu si tes autres points ne répondent pas à l'équation ???
cilouu a écrit : Merci de vos lanternes ! |
Nos lumières !!!
Marsh Posté le 29-07-2009 à 20:32:12
Re ..
Oui mon programme est bien conçu j'imagine tout est paramétré .. héhéhé
Alors oui apparament pour déduire l'équation d'un crecle trois points seulement suffisent .. Après sur mes 10 points je peux en prendre 3 en déduire le cercle et calculer l'écart .
Par contre j'ai utilisé la fonction leastsq de optimize mais sa me donne quelque chose qui n'est pas tout à fait ce que je cherche car ma courbe étant symétrique à certains endroits, mes rayons obtenues devraients être égaux, et ce n'est pas le cas ..
Peux tu m'aider ?
Code :
|
Marsh Posté le 12-07-2009 à 14:21:00
Bonjour,
J'ai une série de fichiers texte que je dois traiter pour créer des courbes et faire des calculs. Ces fichiers texte sont des listes de données (valeurs décimales avec des VIRGULES) séparées par des espaces, qui sont de la forme 1,75892 135,89526 54,8560 .
J'ai réussi à dans un premier temps récupérer les données et les transformer en fichier csv (mais pas à les réécrire et les enregistrer dans le fichier source). Et dans un deuxième temps remplacer les virgules par des points. Cependant je n'ai pas réussi à effectuer les deux actions à la suite car elles ne s'appliquent pas aux mêmes types (type liste et type csv ?).
Merci de votre aide précieuse
Voici un bout des codes :
# Lecture des fichiers texte en CSV
# importer les modules
import csv, math, numpy
# ouvrir et lire le fichier concerne
fichier ="fichier.txt"
fichier_lire=open(fichier,"rb" )
# modifier le fichier en csv et fixer le delimiteur
fichier_csv = csv.reader(fichier_lire,delimiter=" " )
# creer une matrice
tab=list(fichier_csv) # renvoie une valeur de la matrice : tab[Num?ro ligne][Num?ro colonne]
print type(tab), ("\n\n" )
#d?termine le nombre de ligne ( taille de la matrice nbL*2 NB:0,1,2)
nbL=0 # initialisation du nombre de ligne
# row correspond ? une ligne, type list, row affiche la totalit?, row[x] affiche la premi?re valeur de la ligne
for row in fichier_csv:
print row
nbL=nbL+1 # calcul du nombre de lignes dans le fichier texte
for i in range(nbL):
for j in range(2):
tab[i][j]=tab[i][j].replace(".","," )
print tab[1][1], type(tab)
'''contenu=fichier_csv.read()
# creation d'un index pour le remplacement de la virgule par le point pour la lecture des nombres
index={',':'.'}
# remplacement puis affichage
for cle in index:
contenu=contenu.replace(cle,index[cle])
print contenu[0] # correspond ? 1 chaine continu (type str)'''
###################################################################################
# ecrire le contenu dans le fichier source
valeur=[]
'''#for ligne in row:
#valeur.append(row)
#taille2=taille2+1
# pour chaque ligne du fichier, transformer le type str en numpy str
# imprimer la 1ere valeur de la premi?re colonne : print valeur[0]
valeur= numpy.array()
donnees = []
for ligne in fichier_csv:
donnees.append(ligne)
# extraire la premiere colonne et multiplier par pi
for ligne in fichier_csv:
if ligne:
valeur = float(ligne[0])'''
fichier_lire.close()
########################################################
# ouvrir et lire le fichier concerne
fichier ="fichier.txt"
fichier_lire=open(fichier,"rb" )
#fichier_ecrire=open(fichier,"wb" )
contenu=fichier_lire.read()
# creation d'un index pour le remplacement de la virgule par le point pour la lecture des nombres
index={',':'.'}
# remplacement puis affichage
for cle in index:
contenu=contenu.replace(cle,index[cle])
print contenu[0] # correspond ? 1 chaine continu (type str)
# modifier le fichier en csv et fixer le delimiteur
fichier_csv = csv.reader(fichier_lire,delimiter=" " )
for ligne in new_fichier:
new_fichier = csv.writer(contenu)
taille1=0
taille2=0
valeur=[]
for row in fichier_csv:
print row
#for ligne in row:
#valeur.append(row)
#taille2=taille2+1
# pour chaque ligne du fichier, transformer le type str en numpy str
# imprimer la 1ere valeur de la premi?re colonne : print valeur[0]