2010-07-01 6 views
1

Je dispose d'un fichier texte qui est délimité par des tabulations et ressemble à:Python: l'indexation d'un fichier qui est délimité par des tabulations

1_0 NP_045689 100,00 279 0 0 18 296 18 296 3e-156 539

1_0 NP_045688 54,83 259 108 6 45 296 17 273 2e-61 224

Je dois analyser des colonnes spécifiques telles que la colonne 2.

J'ai essayé avec le code ci-dessous:

z = open('output.blast', 'r') 
for line in z.readlines(): 
    for col in line: 
     print col[1] 
z.close() 

Mais j'obtiens un indice hors erreur de plage.

Répondre

4

Découvrez the csv module. Cela devrait vous aider beaucoup si vous envisagez de faire plus de choses avec vos fichiers délimités par des tabulations, aussi. Une bonne chose est que vous pouvez attribuer des noms aux différentes colonnes.

6
z = open('output.blast', 'r') 
for line in z.readlines(): 
    cols = line.split('\t'): 
     print cols[1] 
z.close() 

Vous devez d'abord split() définir la ligne sur les caractères de tabulation.

Vous pouvez également utiliser le module csv de Python en mode délimiteurs d'onglets.

+0

Cela imprimera la deuxième lettre dans chaque colonne - ce n'est pas ce que vous voulez, j'en suis sûr. –

+0

Oups. Le danger de copier coller. :) Fixé. – Amber

2
import csv,StringIO 
text="""1_0 NP_045689 100.00 279 0 0 18 296 18 296 3e-156 539 
1_0 NP_045688 54.83 259 108 6 45 296 17 273 2e-61 224""" 

f = csv.reader(StringIO.StringIO(text), delimiter='\t') 
for row in f: 
    print row[1] 

deux choses à noter:

l'argument delimiter à la méthode de lecture indique le module csv comment diviser la ligne de texte. Vérifiez les autres arguments à la fonction de lecteur pour étendre la fonctionnalité (par exemple: quotechar)

J'utilise StringIO pour envelopper l'exemple de texte en tant qu'objet fichier, vous n'en avez pas besoin si vous utilisez une référence de fichier.

ex:

f=csv.reader(open('./test.csv'),delimiter='\t') 
0

C'est pourquoi votre code va mal:

for col in line: 

va parcourir tous les caractères de la ligne. Un caractère est une chaîne de longueur 1, de sorte que col [1] va toujours donner une erreur d'index hors de l'échelle. Comme d'autres l'ont dit, vous devez soit scinder la ligne sur le caractère TAB '\t', soit utiliser le module csv, qui gère correctement les champs entre guillemets pouvant contenir des onglets ou des retours à la ligne.

Je recommande également d'éviter d'utiliser les lignes de lecture - il va lire tout le fichier en mémoire, ce qui peut causer des problèmes s'il est très important. Vous pouvez parcourir le fichier ouvert une ligne à la fois à la place:

z = open('output.blast', 'r') 
for line in z: 
    ... 
2

Cela a déjà répondu, mais je pensais que je partage l'utilisation de namedtuples pour ce genre de situation, car elle permet objet agréable. attribut d'attribut de type d'attribut.

from collections import namedtuple 
import csv 
rec = namedtuple('rec', 'col1, col2, col3, col4, col5') 
for r in map(rec._make, csv.reader(open("myfile.tab", "rb"), delimiter='\t')): 
    print r.col2, r.col5 

Voir le Python collections documentation pour plus de détails.

Questions connexes