2009-12-20 6 views
1

J'essaie de rechercher un fichier où la ligne contenant le terme recherché est trouvée et imprimée avec un nombre de lignes avant et après le terme de recherche défini par l'utilisateur. Le codage j'ai à ce jour est:Recherche de fichier: TypeError

f = open(f, 'r') 
d = {} 
for n, line in enumerate(f): 
    d[n%numb] = line.rstrip() 
    if search_term in line: 
     for i in rang(n+1,n+1+numb): 
      print d[i%numb] 
     for i in range(1, numb): 
      print f.next().rstrip() 

Mais je reçois un TypeError à d [% engourdis] = line.rstrip() type d'opérande non pris en charge (s) pour%: 'int' et 'str'

aide serait un grand merci

+0

Avez-vous envisagé d'utiliser 'grep -C'? –

+0

numb devrait être combien de lignes avant ou après que vous voulez voir après que le terme de recherche est trouvé. c'est-à-dire, si vous voulez voir 5 lignes avant et après que le mot soit trouvé, alors spécifiez numb = 5 – ghostdog74

+1

vous devriez couper et coller correctement la prochaine fois. Voir http://stackoverflow.com/questions/1927276/searching-a-file/1927413#1927413 again – ghostdog74

Répondre

1

Vous n'avez pas spécifié ce numb est, mais je devine que c'est quelque chose comme:

numb = sys.argv[1] 

Le sys.argv est un tableau de chaînes, plutôt que des entiers. Essayez de convertir la chaîne à un nombre entier:

numb = int(sys.argv[1]) 
0

n% engourdissement peuvent avoir des significations différentes, en fonction du type de n et insensible. Si ce sont les deux nombres, cela signifie "prendre le module", ce que je suppose être ce que vous voulez. Si n est une chaîne, cela signifie faire% de mise en forme. Si n est un nombre et que numb est une chaîne, Python ne sait pas quoi faire et déclenche un TypeError. Avez-vous regardé le message d'erreur sur l'exception? Il devrait dire "type (s) d'opérande non supporté (s) pour%: 'int' et 'str'", qui vous dira tout ce que vous devez savoir. Une fois que vous aurez résolu cela, je ne pense pas que votre programme fera ce que vous voulez - il y a plusieurs problèmes avec cela. 1) si votre terme de recherche est dans les premières lignes engourdies, vous obtiendrez une exception en essayant de lire les lignes du dictionnaire qui n'ont pas encore été insérées. 2) la dernière boucle de votre code lit les lignes suivantes mais ne les recherche pas, donc les occurrences du terme de recherche seront ignorées.

3) Utiliser le module pour maintenir le tampon des lignes est intelligent, mais il y a une meilleure façon. Regardez la classe collections.deque,