2011-07-05 12 views
0

J'ai un fichier texte qui est délimité par des tabulations et j'essaie de comprendre comment rechercher une valeur dans une colonne spécifique dans ce fichier.Rechercher une valeur spécifique dans une colonne spécifique avec Python

Je pense que je dois utiliser l'importation csv, mais j'ai échoué jusqu'à présent. Quelqu'un peut me diriger dans la bonne direction?

Merci!

** Mise à jour ** Merci pour les mises à jour de tout le monde. Je sais que je pourrais probablement utiliser awk pour cela mais simplement pour la pratique, j'essaye de le finir en python.

Je reçois l'erreur suivante maintenant: si row.split (» «) [int (searchcolumn)] == SearchQuery: IndexError: liste des index hors de portée

Et voici l'extrait de mon code:

#open the directory and find all the files 
for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
     f=open(file, 'r') 
     lines=f.readlines() 
     for line in lines: 
      #the first 4 lines of the file are crap, skip them 
      if linescounter > startfromline: 
       with open(file) as infile: 
        for row in infile: 
         if row.split(' ')[int(searchcolumn)] == searchquery: 
          rfile = open(resultsfile, 'a') 
          rfile.writelines(line) 
          rfile.write("\r\n") 
          print "Writing line -> " + line 
          resultscounter += 1 
     linescounter += 1 
     f.close() 

Je prends à la fois searchcolumn et searchquery en tant que raw_input de l'utilisateur. Im deviner la raison pour laquelle je suis en train de sortir la liste hors de portée maintenant, est parce que ce n'est pas l'analyse du fichier correctement?

Merci encore.

+1

Si cela ne fait pas partie d'une application Python plus grande, vous pouvez constater que c'est le genre de chose pour laquelle 'awk' a été créé. –

Répondre

2

Oui, vous voulez utiliser le module csv, et vous voulez définir délimiteur \ « t »:

spamReader = csv.reader(open('spam.csv', 'rb'), delimiter='\t') 

Après cela, vous devriez pouvoir itérer:

for row in spamReader: 
    print row[n] 
+0

Mais que faire si je veux demander à l'utilisateur une "colonne de recherche" afin que je puisse rechercher des valeurs sur une colonne spécifique .... pas dans une rangée. – Craig

+0

Ce qui précède vous permettra de faire une recherche dans la colonne. 'si row [n] == searchterm: #do quelque chose.' – cwallenpoole

3

Vous pouvez également utiliser le renifleur (exemple tiré de http://docs.python.org/library/csv.html)

csvfile = open("example.csv", "rb") 
dialect = csv.Sniffer().sniff(csvfile.read(1024)) 
csvfile.seek(0) 
reader = csv.reader(csvfile, dialect) 
0

Cette imprime toutes les lignes filename avec 'myvalue' dans la quatrième colonne tabulé:

with open(filename) as infile: 
    for row in infile: 
     if row.split('\t')[3] == 'myvalue': 
      print row 

Remplacer 3, 'myvalue', et print selon le cas.

Questions connexes