Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3061 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  lecture/écriture fichier texte et conversion en données numériques

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

lecture/écriture fichier texte et conversion en données numériques

n°1904682
cilouu
Posté le 12-07-2009 à 14:21:00  profilanswer
 

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]

mood
Publicité
Posté le 12-07-2009 à 14:21:00  profilanswer
 

n°1904824
Sve@r
Posté le 13-07-2009 à 11:16:54  profilanswer
 

cilouu a écrit :

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]


 
 
Pfff qu'est-ce que tu te compliques la vie !!!

Code :
  1. #!/usr/bin/env python
  2. fp=open("fichier", "r" )
  3. for line in fp:
  4.     tabNbr=[float(n) for n in line.replace(",", "." ).split(" " )]
  5.     print tabNbr
  6. fp.close()



---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1905014
cilouu
Posté le 13-07-2009 à 21:06:54  profilanswer
 

Peut être .. mais là le compilateur me répond qu'un entier est requis .  
Comment résoudre le problème ?

n°1905054
Sve@r
Posté le 14-07-2009 à 10:43:39  profilanswer
 

cilouu a écrit :

Peut être .. mais là le compilateur me répond qu'un entier est requis .  
Comment résoudre le problème ?


 
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...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1905057
esox_ch
Posté le 14-07-2009 à 10:52:08  profilanswer
 

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 ..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1905109
cilouu
Posté le 14-07-2009 à 20:01:41  profilanswer
 

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()

n°1905133
KangOl
Profil : pointeur
Posté le 15-07-2009 à 00:13:54  profilanswer
 

haha le bug vicieux...
 
vire les 5 premières lignes et mets le chemin complet dans le open


---------------
Nos estans firs di nosse pitite patreye...
n°1905136
cilouu
Posté le 15-07-2009 à 00:56:34  profilanswer
 

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 :p  
Merci à tous ceux qui ont posté ou posteront une réponse

n°1905139
cilouu
Posté le 15-07-2009 à 01:17:18  profilanswer
 

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 ?

n°1906418
cilouu
Posté le 18-07-2009 à 23:06:00  profilanswer
 

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

mood
Publicité
Posté le 18-07-2009 à 23:06:00  profilanswer
 

n°1906421
Sve@r
Posté le 18-07-2009 à 23:18:12  profilanswer
 

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.
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.


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 ?  
Sinon avez vous une méthode à me proposer ?


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 !
 
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 ?


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

  • façon 1

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
 

  • façon 2

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....


Message édité par Sve@r le 18-07-2009 à 23:20:12

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1906424
cilouu
Posté le 18-07-2009 à 23:26:47  profilanswer
 

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 ?

n°1906483
Sve@r
Posté le 19-07-2009 à 14:07:48  profilanswer
 

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 :
  1. fres=open("synthese.txt", "w" )
  2. for file in ("fichier1", "fichier2", "fichier3", "fichier4", ...):
  3.     fwork=open(file, "r" )
  4.     for line in fwork:
  5.           <... traitement qui utilise la ligne lue ... bla bla bla et résultat ...>
  6.     fwork.close()
  7.     fres.write(resultat)
  8. fres.close()


 
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 :
  1. import os
  2. for file in os.listdir(repertoire):
  3.     fwork=open(file, "r" )
  4.     ...


 
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 :
  1. import os
  2. import stat
  3. if stat.S_ISREG(os.stat(file)[stat.ST_MODE]):
  4.     print "fichier standard"
  5. else:
  6.     print "fichier autre"


 

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...

Message cité 1 fois
Message édité par Sve@r le 19-07-2009 à 14:11:39

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1906485
masklinn
í dag viðrar vel til loftárása
Posté le 19-07-2009 à 14:37:23  profilanswer
 

Sve@r a écrit :

Code :
  1. for file in ("fichier1", "fichier2", "fichier3", "fichier4", ...):



ಠ_ಠ ಠ_ಠ ಠ_ಠ
ಠ_ಠ ಠ_ಠ ಠ_ಠ
ಠ_ಠ ಠ_ಠ ಠ_ಠ

Message cité 1 fois
Message édité par masklinn le 19-07-2009 à 14:37:55

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1906491
Sve@r
Posté le 19-07-2009 à 15:20:53  profilanswer
 

masklinn a écrit :


ಠ_ಠ ಠ_ಠ ಠ_ಠ
ಠ_ಠ ಠ_ಠ ಠ_ಠ
ಠ_ಠ ಠ_ಠ ಠ_ಠ


 
Ah ? J'ai dit une connerie :??:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1906492
cilouu
Posté le 19-07-2009 à 15:20:54  profilanswer
 

Super, merci beaucoup !!
 j'essaye ça demain et je vous en dit plus sur mes difficultées prochaines.

n°1906495
masklinn
í dag viðrar vel til loftárása
Posté le 19-07-2009 à 15:29:20  profilanswer
 

Sve@r a écrit :


 
Ah ? J'ai dit une connerie :??:


T'en as dit 2:

  • Nommer ta variable file. C'est un builtin, on écrase pas les builtins (même si file a disparu en 3.x, il est toujours là dans 2.x)
  • Utiliser un tuple alors que tu veux une séquence, donc une liste. Une liste a un ordre, un tuple à une structure (même si en Python, un tuple est implémenté par une liste immutable)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1906501
cilouu
Posté le 19-07-2009 à 16:13:17  profilanswer
 

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

n°1906955
Sve@r
Posté le 20-07-2009 à 19:26:41  profilanswer
 

masklinn a écrit :


T'en as dit 2:

  • Nommer ta variable file. C'est un builtin, on écrase pas les builtins (même si file a disparu en 3.x, il est toujours là dans 2.x)

Ah zut, j'aurais pas dû. Mais qui peut se vanter de connaitre tous les builtin ???
 

masklinn a écrit :

  • Utiliser un tuple alors que tu veux une séquence, donc une liste. Une liste a un ordre, un tuple à une structure (même si en Python, un tuple est implémenté par une liste immutable)

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 ..  
Merci


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...
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1906957
masklinn
í dag viðrar vel til loftárása
Posté le 20-07-2009 à 19:42:13  profilanswer
 

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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1906961
cilouu
Posté le 20-07-2009 à 19:52:10  profilanswer
 

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‏

n°1906962
cilouu
Posté le 20-07-2009 à 19:59:30  profilanswer
 

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" )
 
 

n°1906979
Sve@r
Posté le 20-07-2009 à 20:36:53  profilanswer
 

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 :
exceptions import error : cannot import name Artist‏


 
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 ??
 
 
 
import numpy
from pylab import *
from matplotlib import pyplot as plt
from os import *
 
chdir("C:\Dossier\test" )
 
 


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 :
  1. chdir("C:/Dossier/test" )


 
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...

Message cité 1 fois
Message édité par Sve@r le 20-07-2009 à 20:40:10

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1906992
masklinn
í dag viðrar vel til loftárása
Posté le 20-07-2009 à 20:55:33  profilanswer
 

Sve@r a écrit :


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.


Ou alors utiliser des rawstrings, ou doubler ses escapes, ou utiliser os.path.join


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1906996
cilouu
Posté le 20-07-2009 à 21:03:43  profilanswer
 

http://nsa08.casimages.com/img/2009/07/20/09072009063555595.jpg

n°1906997
cilouu
Posté le 20-07-2009 à 21:04:11  profilanswer
 

Avec cela, sa viendrait du module ou d'un ligne ?

n°1906998
cilouu
Posté le 20-07-2009 à 21:07:01  profilanswer
 

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

n°1907450
Sve@r
Posté le 21-07-2009 à 22:19:17  profilanswer
 

cilouu a écrit :

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


 
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 :
  1. import toto
  2. import titi
  3. import tutu


 
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 :
  1. from toto import *
  2. from titi import *
  3. from tutu import *


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 :
  1. import dependance.toto
  2. import dependance.titi
  3. import dependance.tutu


 
Ou de celle-là

Code :
  1. from dependance import toto
  2. from dependance import titi
  3. from dependance import tutu


 
Ou même

Code :
  1. from dependance import *


 
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...


Message édité par Sve@r le 21-07-2009 à 23:07:31

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1907783
cilouu
Posté le 22-07-2009 à 22:41:47  profilanswer
 

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 ??

n°1908126
Sve@r
Posté le 23-07-2009 à 21:46:59  profilanswer
 

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"....


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1908129
cilouu
Posté le 23-07-2009 à 22:29:34  profilanswer
 

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 ?

n°1908133
Sve@r
Posté le 23-07-2009 à 23:32:19  profilanswer
 

cilouu a écrit :

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 ?


 
Pour ta matrice ? Tape "matrice python" dans google et t'auras plein de réponse. Par exemple "numpy.matrix" (nécessite le module numpy)...


Message édité par Sve@r le 23-07-2009 à 23:35:14

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1908577
cilouu
Posté le 25-07-2009 à 22:04:09  profilanswer
 

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 !

Message cité 1 fois
Message édité par cilouu le 25-07-2009 à 22:06:01
n°1908590
Sve@r
Posté le 26-07-2009 à 00:27:30  profilanswer
 

cilouu a écrit :

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 !

 

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 :
  1. class cElem:
  2.     def __init__(self, a, b):
  3.         self.a=a
  4.         self.b=b
  5.     def __cmp__(self, other):
  6.         if self.a < other.a: return -1
  7.         if self.a > other.a: return 1
  8.         return 0
 

Eventuellement il contiendra aussi la méthode "__str__" renvoyant une chaine représentative de l'objet

Code :
  1. def __str__(self):
  2.         return "%s-%s" % (self.a, self.b)
 

Ensuite, tu remplis ton tableau avec "n" lignes d'objet, chaque instance d'objet stockant les 2 infos

Code :
  1. tab=[]
  2. for i in range(10):
  3.     tab.append(cElem(10 - i, i))
  4.  
  5. for i in tab: print i
 

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 :
  1. tab.sort()
  2. for i in tab: print i


Message édité par Sve@r le 26-07-2009 à 00:28:23

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1908615
cilouu
Posté le 26-07-2009 à 13:08:18  profilanswer
 

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 ?

n°1908617
cilouu
Posté le 26-07-2009 à 13:18:20  profilanswer
 

une précision supplémentaire : Je dois modifier les données stockées dans la matrice ..
Merci pour vos réponses :)

n°1908619
Sve@r
Posté le 26-07-2009 à 13:56:06  profilanswer
 

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).
Il aurait été plus simple apparement de creer un dictionnaire ou classe, mais je ne savais pas comment faire à ce moment là.


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 :
  1. toto=cElem(1, 2)
  2. titi=cElem(3,4)
  3. print "%s" % toto
  4. print "%s" % titi


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.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1909535
cilouu
Posté le 28-07-2009 à 20:57:17  profilanswer
 

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 !  :)

Message cité 1 fois
Message édité par cilouu le 28-07-2009 à 20:59:38
n°1909556
Sve@r
Posté le 28-07-2009 à 23:09:32  profilanswer
 

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 ..
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 ?


 
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 !!!


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1910072
cilouu
Posté le 29-07-2009 à 20:32:12  profilanswer
 

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 :
  1. def eval_num(tab,borne1,borne2) :
  2.     def residuals(p,x,y) :
  3.         a,b,r = p
  4.         eq = ((a-x)*(a-x) + (b-y)*(b-y) -r*r)   # equation du cercle
  5.         return eq
  6.     def peval(x,p) :
  7.         return ((p[0]-x)*(p[0]-x) + (p[1]-y)*(p[1]-y) - p[2]*p[2])
  8.     from scipy.optimize import leastsq
  9.     p0 = [1.0,1.0,1.0]                          #initialisation du rayon
  10.     xvec =[]
  11.     yvec=[]
  12.     global px
  13.     global py
  14.     # creation des tableaux des valeurs connues
  15.     for j in range(taille_tab1) :
  16.         if (tab1[j] >= borne1 )&(tab1[j]<= borne2) :
  17.             xreel = tab1[j]
  18.             xvec.append(xreel)
  19.             yreel = tab[j]
  20.             yvec.append(yreel)
  21.     # calcul des rayrons et des centres (inconnues)
  22.     for k in range(len(xvec)) :
  23.         rayon_opt = leastsq(residuals,p0,args=(xvec,yvec),maxfev=100000)
  24.     print rayon_opt
  25.     px = rayon_opt[0][0]
  26.     py = rayon_opt[0][1]
  27. '''Calcul des rayons et des centres des cercles d?efinis par les points du profil (matrice_mini et maxi)
  28.     Methode des moindres carrees'''
  29. def essai_calculrayons() :
  30. # bornes _ R1 : origine-6 // R2 : 6.5 - 18.5  // R3 : 19 - 26.5
  31.     global Rx       # initialisation des variables des tableaux pour le graphique
  32.     global Ry
  33.     Rx = []; Ry = []
  34.     eval_num(matrice_mini,-26.5,-19)
  35.     Rx.append(px)
  36.     Ry.append(py)
  37.     eval_num(matrice_mini,-18.5,-6.5)
  38.     Rx.append(px)
  39.     Ry.append(py)
  40.     eval_num(matrice_mini,-6,6)
  41.     Rx.append(px)
  42.     Ry.append(py)
  43.     eval_num(matrice_mini,6.5,18.5)
  44.     Rx.append(px)
  45.     Ry.append(py)
  46.     eval_num(matrice_mini,19,26.5)
  47.     Rx.append(px)
  48.     Ry.append(py)
  49.     # trace les points des centres des cercles de rayons R1, R2 et R3
  50.     plot(Rx,Ry,"go" )


 
 

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  lecture/écriture fichier texte et conversion en données numériques

 

Sujets relatifs
ImageMagick: convert: couleur de texte = "négatif" ?Redirection et envoi de données en POST avec applet Java
Type de données incompatible dans l'expression du critèreconnecter à une base de données Mysql via ODBC à partir d'un programme
Afficher texte au survol javascriptVBS Copier le nom d'un fichier
récupérer une ligne de texte pointée dans un fichier txt[Résolu][VBA] Importer des données d'un fichier.txt
Plus de sujets relatifs à : lecture/écriture fichier texte et conversion en données numériques


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR