Extraire du float d'un fichier en .txt

Extraire du float d'un fichier en .txt - Python - Programmation

Marsh Posté le 26-06-2015 à 10:47:06    

Bonjour,
 
Cela fait déjà un moment que je cherche un moyen de transformer les données du fichier texte en float après lecture de celui-ci.
J'ai déjà regardé des sujets similaires mais même leurs résolution ne fonctionne pas chez moi. Je dois avoir fait une erreur de codage.
Voici mon code :
 
import matplotlib.pyplot as plt
from numpy import *
 
 
courbet=open("acqui5 (good)(T)(27sec).txt" )
 
courbev=open("acqui5 (good)(V)(27sec).txt" )
 
 
t = []
v = []
i = 0
um = 0.0006
freq = []
 
while i<=100 :
   
    textet = courbet.readline().rstrip('\n\r').split('\n')
    textev = courbev.readline().rstrip('\n\r').split('\n')
     
    print(textet,textev)
    t.append(textet)
    v.append(textev)
    i=i+1
 
 
print(v[1],v[2],v[3])
print(float(v[1]))
 
Les éléments en surplus sont là pour la suite. En gros la liste t représente le temps et v une tension. Donc un fichier txt pour le temps et un autre pour la tension. Le hic c'est que le résultat est sous la forme : ['0.0002'] par exemple avec les '.  
 
Merci d'avance pour vos lumières.

Reply

Marsh Posté le 26-06-2015 à 10:47:06   

Reply

Marsh Posté le 26-06-2015 à 12:35:34    

Le split('\n') n'a pas de sens: readline() va lire juste une ligne (avec caractères de fin de ligne), si tu split au lieu d'avoir une chaîne tu vas avoir une liste de 2 éléments (la partie avant la fin de ligne, et une chaîne vide pour la partie après la fin de ligne).

 

Si tu veux simplement retirer le caractère de fin de ligne, utilise juste .rstrip() sans donner de paramètre ça va enlever tous les "whitespace" finaux (espace, tabulation, fin de ligne), et ce n'est même pas utile: float() ignore les blancs ce bricolage n'a tout simplement pas lieu d'être

Code :
  1. >>> float('0.005\n')
  2. 0.005
 

Mais fondamentalement le code utilise mal Python: si tu veux récupérer les 100 premières lignes de chaque fichier, une meilleure manière de le faire serait:

Code :
  1. from itertools import islice
  2.  
  3. with open("acqui5 (good)(T)(27sec).txt", 'rb') as courbet:
  4.    t = list(islice(courbet, 100))
  5. with open("acqui5 (good)(V)(27sec).txt", 'rb') as courbev:
  6.    v = list(islice(courbev, 100))
 

Si les deux fichiers contiennent des floats, tu peux faire ta conversion pendant la lecture: au lieu de list, suffit d'utiliser map:

Code :
  1. from itertools import islice
  2.  
  3. with open("acqui5 (good)(T)(27sec).txt", 'rb') as courbet:
  4.    t = map(float, islice(courbet, 100))
  5. with open("acqui5 (good)(V)(27sec).txt", 'rb') as courbev:
  6.    v = map(float, islice(courbev, 100))
 


Message édité par masklinn le 26-06-2015 à 12:36:57

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 26-06-2015 à 12:53:36    

Et bien je ne saurais t'expliquer pourquoi mais sans le split j'obtiens bien le ['0.000x\n'] avec x un nombre quelconque. Avec le split le \n n'apparait plus.
Merci d'avoir pris du temps pour me répondre, j'ai noté les fonctions que tu utilises au cas où et qui m'ont l'air bien plus utiles que mon bricolage. Cependant mon soucis venait du fait que je créais une liste de liste donc il fallait chercher le float des v[i][0], ce qui fonctionne bien.
 
 
Encore merci à toi et bonne journée.

Reply

Marsh Posté le 26-06-2015 à 13:21:24    

anaxagore1 a écrit :

Et bien je ne saurais t'expliquer pourquoi mais sans le split j'obtiens bien le ['0.000x\n'] avec x un nombre quelconque. Avec le split le \n n'apparait plus.


C'est normal. Split crée une liste (toujours) de tous les éléments sur les côtés du séparateur.

 

Donc si ta ligne est 0.0005\n, lst.append(line) va donner

Code :
  1. ['0.0005\n']


et lst.append(line.split('\n') va donner

Code :
  1. [['0.0005', '']]


(une liste contenant ce qui est avant le séparateur et ce qui est après, la partie après le séparateur étant vide)


Message édité par masklinn le 26-06-2015 à 13:21:54

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed