2010-11-26 22 views
1

Il est sûr de dire que je suis un noob en programmation et en python, donc j'ai vraiment besoin d'aide pour gérer un fichier. Mon fichier est un fichier dat avec un entier, une chaîne et un flottant dans chaque ligne, et j'ai besoin de comparer le premier int avec d'autres ints et le float avec une autre valeur, j'ai besoin d'avoir les valeurs sous forme de nombres et non dans le cadre d'une chaîne pour effectuer des opérations mathématiques.Diviser une chaîne par type de données à l'intérieur de chaque ligne de fichier en python

C'est le code que je l'ai fait, mais j'ai regardé partout dans les googles et je ne peux pas trouver une fonction qui fait cela:

readfile = open('file_being_read.dat').read() 

def parsa_lista(file_to_read): 
    converted = [] 
    for line in file_to_read: 
     #conversion should happen here and write it to the list named "converted" 
     #my google-fu has failed me.. 
    return converted 

print parsa_lista(readfile) 

Le fichier ressemble à ceci, mais couvre quelques-uns 600 lignes. De plus, je m'apprête à apprendre tout ce que je fais, et j'étais vraiment incapable de trouver de l'aide, cela pourrait avoir quelque chose à voir avec le manque de connaissances de base dans les types de données ou quelque chose du genre.

C'est la sortie de la liste, comme imprimé avec « % r »:

 
... 
249 LEU 89.81637573242188\n 
250 ALA 6.454087734222412\n 
251 ILE 42.696006774902344\n 
252 VAL 39.9482421875\n 
253 LEU 58.06844711303711\n 
254 SER 6.285697937011719\n 
255 HIS 22.92508316040039\n 
256 THR 49.1857795715332\n 
257 ASN 15.033650398254395\n 
258 SER 12.086835861206055\n 
259 VAL 28.70435905456543\n 
260 VAL 39.53983688354492\n 
261 ASN 18.63718605041504\n 
262 PRO 15.275177955627441\n 
263 PHE 120.84526062011719\n 
264 ILE 26.20943260192871\n 
265 TYR 16.6826114654541\n 
266 ALA 34.382598876953125\n 
267 TYR 179.9381103515625\n 
268 ARG 77.62599182128906\n 
269 ILE 45.021034240722656\n 
270 ARG 133.72328186035156\n 
... 

vous espérez les gars peuvent me aider, même quelques directives générales sur la façon dont je devrais aller à ce sujet dans les chaînes de fractionnement et de comparer les valeurs seront très appréciées.

Répondre

3

Ignacio's answer est fondamentalement tout à fait correct, et il a affiché avant même de commencer à taper. Cependant, permettez-moi d'expliquer son deux-liner dans un peu plus de détails.

Lecture d'un fichier

D'abord, une critique de votre code:

readfile = open('file_being_read.dat').read() 

Cela va lire votre fichier entier dans une chaîne géante. Lorsque vous essayez d'itérer sur cette chaîne, vous la parcourez lettre par lettre. Modifiez cette ligne à cette place:

readfile = open('file_being_read.dat') 

Maintenant, quand vous itérer sur cet objet fichier, vous en train de lire la ligne par ligne fichier.

Tokenising

Vous avez trouvé que itérer sur un fichier que vous obtient la ligne par ligne texte. Maintenant vous devez diviser chaque ligne en ces trois valeurs.

Si les valeurs sont séparées par des espaces (comme votre extrait de fichier de données), Python rend cela très facile avec le str.split method. N'importe quelle quantité ou type (tabulation, espace) d'espaces entre ces valeurs est correct. En fait, même la nouvelle ligne traînante est dépouillée. Alors maintenant vous avez une liste de trois chaînes.

Interprétation

Ensuite, vous devez convertir les chaînes en nombres entiers et nombres à virgule flottante. Ici, utilisez les fonctions intégrées int et float.

>>> vals[0] 
'249' 
>>> int(vals[0]) 
249 
>>> vals[2] 
'89.81637573242188' 
>>> float(vals[2]) 
89.816375732421875 

À ce stade, il vous suffit de empaqueter ces valeurs dans un tuple et les ajouter à converted.

datum = int(vals[0]), vals[1], float(vals[2]) 
>>> datum 
(249, 'LEU', 89.816375732421875) 

Pourquoi un tuple au lieu d'une liste? Les listes sont modifiables: vous pouvez ajouter et supprimer des éléments. Ce n'est probablement pas ce dont vous avez besoin.

(Vous verrez probablement des parenthèses autour d'un tuple littéral.C'est l'une des rares fois où l'ordre des opérations les rend inutiles.Vous pouvez mettre des accolades autour de tout le côté droit de l'assignation et cela fonctionnera très bien.)

Mettre ensemble

def parsa_lista(file_to_read): 
    converted = [] 
    for line in file_to_read: 
     vals = line.split() 
     datum = int(vals[0]), vals[1], float(vals[2]) 
     converted.append(datum) 
    return converted 
+0

Cette explication m'a beaucoup aidé, merci, j'avais vraiment besoin de quelques conseils concernant le traitement des données. – Johanu

+0

J'ai juste quelques questions de plus, la création de datum dans chaque ligne écrase le tuple, et le résultat final est juste le tuple de la dernière ligne. Est-ce une bonne pratique d'ajouter chaque ligne pour créer une liste de tuples, ou de créer, d'une façon ou d'une autre, un tuple comprenant la donnée relative à chaque ligne? Peut-être que je pourrais ajouter à une liste et ensuite créer un tuple sur une liste, mais cela ne semble vraiment pas être une bonne pratique. – Johanu

+0

J'ai ajouté la fonction 'parsa_lista' complétée. Comme je l'ai déjà dit, Ignacio a essentiellement la bonne réponse; Je ne fais que l'expliquer plus en détail. Avoir le résultat final être une liste de tuples semble parfaitement acceptable. Cependant, par curiosité, la première colonne est-elle juste les numéros de ligne? Si c'est le cas, il pourrait probablement être évité en toute sécurité; les listes peuvent être consultées par index. (Par exemple, 'converti [224]' est le 225ème élément de la liste 'convertie'.) – Wesley

2
vals = line.split() 
converted.append((int(vals[0]), vals[1], float(vals[2]))) 
+0

travaillé comme un charme, vient d'apprendre quelque chose aujourd'hui utile. Merci. – Johanu