[Python] trovare parole su file txt

Riccardo Lemmi riccardo a reflab.com
Gio 13 Ott 2011 20:03:23 CEST


simone s wrote:

> 
> Salve a tutti, avrei un piccolo problema con python, premetto che sono ancora
> nuovo su python; sto cercando di creare un programma che cerca delle parole in
> un file .txt e restituisce la loro posizione; ho provato a scrivere un paio di
> righe, ma il problema è che entra in un ciclo infinito...ecco il codice che ho
> scritto:

Il problema non è il ciclo infinito: la prima cosa è imparare a pensare in 
python :)

Dalla lettura del codice suppongo che tu voglia trovare la posizione del 
carattere "a" all'interno del file.

> ---------------------
> import string
> 
> f = open("prova.txt", "r")
> leggi = f.read()

Qui hai letto tutto il file e l'hai messo in leggi, quindi non avresti più 
bisogno di usare il file.

> f.seek(0)

Qui riporti il cursore in testa, giustamente dato che hai letto già tutto con il 
read precedente, ma avendo già i dati diventa un'operazione inutile.

> print leggi
> posizione = string.find(leggi, "a")

posizione = leggi.find("a")

> print posizione
> contatore = 0
> while posizione >= 0:
> 
>     if contatore == 0:
>                 
>         f.seek(posizione)
>         leggi = f.read(10)
>         print leggi
>         contatore = 2
>                 
>     elif contatore != 0:
> 
>         f.seek(posizione+1)
>         leggi = f.read()
>         posizione = string.find(leggi, "a")
>         print posizione
>         f.seek(posizione+1)
>         leggi = f.read(10)
>         print leggi
> 
> ---------------------------------
> 
> ...spero che qualcuno riesca ad aiutarmi, ma soprattutto spero di essermi
> registrato correttamente alla mailing list XD

A dire il vero ci si perde in questo codice, la cosa più semplice penso che sia 
una di queste versioni:


for i,c in enumerate(leggi):
    if c=="a" : print i

#
print [i for i,c in enumerate(leggi) if c=="a"]

che non usano né il find né il while ma sfruttano il fatto che stai cercando un 
solo carattere. Discorso diverso se vuoi trovare una stringa:


sstr = "sa"
lsstr = len(sstr)

pos = leggi.find(sstr)
print pos
while True:
    new_pos = leggi.find(sstr, pos+lsstr)
    if new_pos == -1:
        break
    else:
        pos = new_pos
        print pos

oppure 

import re
expr = re.compile('sa')
for e in expr.finditer(leggi):
    print e.start()


Diventa più complicato se vuoi usare il seek: fondamentalmente non conviene 
usare il find ma estrarre un carattere alla volta dal file e confrontarlo con 
quello che cerchi quindi stampare il valore del cursore. Stesso discorso per una 
stringa ma in questo caso aggiungi il carattere in coda ad un buffer di 
dimensione fissa.
-- 
                                       Riccardo Lemmi



Maggiori informazioni sulla lista Python