[RISOLTO][PYTHON] Leggere una riga a volta

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
Ivan!
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1560
Iscrizione: sabato 21 giugno 2008, 12:24

[RISOLTO][PYTHON] Leggere una riga a volta

Messaggio da Ivan! »

Salve  :)

Sto creando un plugin di emesene che cambi il messaggio personale in base a delle frasi prese da un file di testo...

Va tutto bene però non riesco a leggere un file riga per riga...
Ho usato

Codice: Seleziona tutto

file.readline(num)
ma legge lettera per lettera...  ??? ::)

C'è un modo per fare quello che voglio io??

grazie :)
Ultima modifica di Ivan! il lunedì 8 settembre 2008, 11:50, modificato 1 volta in totale.
Avatar utente
Volans
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4915
Iscrizione: domenica 4 dicembre 2005, 11:25
Contatti:

Re: [PYTHON] Leggere una riga a volta

Messaggio da Volans »

Che "num" hai usato? Prova ad usare readline() senza parametri, vedi la relativa documentazione qui.
Volans
Prima di scrivere leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Ikitt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1816
Iscrizione: mercoledì 24 ottobre 2007, 12:05

Re: [PYTHON] Leggere una riga a volta

Messaggio da Ikitt »

Ivan! ha scritto: Salve  :)

Sto creando un plugin di emesene che cambi il messaggio personale in base a delle frasi prese da un file di testo...

Va tutto bene però non riesco a leggere un file riga per riga...
Ho usato

Codice: Seleziona tutto

file.readline(num)
ma legge lettera per lettera...  ??? ::)

C'è un modo per fare quello che voglio io??

Codice: Seleziona tutto

f = open("/un/file.txt", "r")
for line in f:
    print f
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [PYTHON] Leggere una riga a volta

Messaggio da crap0101 »

Ivan! ha scritto:
Va tutto bene però non riesco a leggere un file riga per riga...
Ho usato

Codice: Seleziona tutto

file.readline(num)
ma legge lettera per lettera...  ??? ::)
con un numero legge `num` byte per riga
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
Ivan!
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1560
Iscrizione: sabato 21 giugno 2008, 12:24

Re: [PYTHON] Leggere una riga a volta

Messaggio da Ivan! »

Volans ha scritto: Che "num" hai usato? Prova ad usare readline() senza parametri, vedi la relativa documentazione qui.
num (in verità self.num) è un numero che cresce di 1 in 1 ogni 60 secondi...
Ikitt ha scritto:

Codice: Seleziona tutto

f = open("/un/file.txt", "r")
for line in f:
    print f
ok grazie lo proverò :)
crap0101 ha scritto: con un numero legge `num` byte per riga
si infatti la prima riga era "ciao" e con readline(1) dava in output: "c"
con 2 dava "ia" ecc ecc
Avatar utente
Volans
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4915
Iscrizione: domenica 4 dicembre 2005, 11:25
Contatti:

Re: [PYTHON] Leggere una riga a volta

Messaggio da Volans »

Allora con readline() dovresti risolvere, oppure c'è anche readlines()
Volans
Prima di scrivere leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Avatar utente
marko782
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 284
Iscrizione: sabato 24 marzo 2007, 12:53
Località: Monza (MI)

Re: [PYTHON] Leggere una riga a volta

Messaggio da marko782 »

Ikitt ha scritto:
Ivan! ha scritto: Salve  :)

Sto creando un plugin di emesene che cambi il messaggio personale in base a delle frasi prese da un file di testo...

Va tutto bene però non riesco a leggere un file riga per riga...
Ho usato

Codice: Seleziona tutto

file.readline(num)
ma legge lettera per lettera...  ??? ::)

C'è un modo per fare quello che voglio io??

Codice: Seleziona tutto

f = open("/un/file.txt", "r")
for line in f:
    print f
Dovrebbe essere print line e non print f
Ikitt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1816
Iscrizione: mercoledì 24 ottobre 2007, 12:05

Re: [PYTHON] Leggere una riga a volta

Messaggio da Ikitt »

marko782 ha scritto:
Ikitt ha scritto:
Ivan! ha scritto: Salve  :)

Sto creando un plugin di emesene che cambi il messaggio personale in base a delle frasi prese da un file di testo...

Va tutto bene però non riesco a leggere un file riga per riga...
Ho usato

Codice: Seleziona tutto

file.readline(num)
ma legge lettera per lettera...  ??? ::)

C'è un modo per fare quello che voglio io??

Codice: Seleziona tutto

f = open("/un/file.txt", "r")
for line in f:
    print f
Dovrebbe essere print line e non print f
Yup, vero, errore mio stupido.
Avatar utente
Ivan!
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1560
Iscrizione: sabato 21 giugno 2008, 12:24

Re: [PYTHON] Leggere una riga a volta

Messaggio da Ivan! »

Allora, ho usato il metodo descritto da Volans...
e funziona  :)

solo che quando arriva alla fine del file non riparte da capo...
per farvi capire meglio posto il codice come era prima e come è adesso:

Codice: Seleziona tutto

	def refresh( self ):
		'''refresh the personal message with the new message'''
			
		self.msg = self.mess_file.readline(self.num)
		
		if self.msg != "fine":
			self.controller.contacts.set_message(self.msg)	
			self.num = self.num + 1
			
		elif self.msg == "fine":
			self.num = 0
		
		return True
e adesso

Codice: Seleziona tutto

	def refresh( self ):
		'''refresh the personal message with the new message'''
			
		self.msg = self.mess_file.readline()
		
		self.controller.contacts.set_message(self.msg)

		return True
nel codice originario mi tornava all'inizio mettendo self.num = 0 (anche se non leggeva le righe ma i byte, o caratteri)... qui come si può fare a settarlo che ricominci da capo??

Inoltre nel messaggio personale mi include anche il carattere di ritorno  capo...

grazie a tutti per l'aiuto dato :) :)
Avatar utente
Volans
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4915
Iscrizione: domenica 4 dicembre 2005, 11:25
Contatti:

Re: [PYTHON] Leggere una riga a volta

Messaggio da Volans »

Da capo intendi da capo del file?
In questo caso basta oggettoFile.seek(0), vedi sempre la stessa pagina di documentazione che ti ho linkato prima ;)
Volans
Prima di scrivere leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Avatar utente
Ivan!
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1560
Iscrizione: sabato 21 giugno 2008, 12:24

Re: [PYTHON] Leggere una riga a volta

Messaggio da Ivan! »

Volans ha scritto: Da capo intendi da capo del file?
sisi  :) grazie l'avevo visto di sfuggita ma non avevo letto...

Allora l'ho messo, ma non sono ancora riuscito a farlo funzionare:

Codice: Seleziona tutto

	def refresh( self ):
		'''refresh the personal message with the new message'''
			
		self.msg = self.mess_file.readline()
		
		if self.msg != "fine":
			self.controller.contacts.set_message(self.msg)	
			
		else:
			self.mess_file.seek(0)
		
		return True
Ho cercato di fare in modo che quando trova in una riga la parola fine riparta da zero con il comando di volans...
ma mi scrive la parola fine e poi smette di funzionare, nel senso che viene scritto "inserire un messaggio personale" e non mi mette i messaggi del mio file...

ma non mi riesce farlo funzionare :(

ciao e grazie a tutti :) :)
Avatar utente
Volans
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4915
Iscrizione: domenica 4 dicembre 2005, 11:25
Contatti:

Re: [PYTHON] Leggere una riga a volta

Messaggio da Volans »

Ma se c'è la parola fine nel file tu fai ripartire il file da zero???
Ci sono tanti modi di controllare la fine del file senza "scriverci fine dentro" ;)

Dipende da come funziona la classe che ci hai fatto intorno ma se non ho capito male tu vuoi che riinizi e comunque imposti il messaggio quindi dovresti mettere seek(0) e poi la riga per settare il messaggio no?
Volans
Prima di scrivere leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
gaspa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 754
Iscrizione: lunedì 5 dicembre 2005, 13:12
Località: Castenaso

Re: [PYTHON] Leggere una riga a volta

Messaggio da gaspa »

ma semplicemente controllare che la riga ci sia non ti va bene?

Codice: Seleziona tutto

if not msg:
    self.mess_file.seek(0)
else:
    self.controller.contacts.set_message(msg)	
due cosette:
1) se non usi self.msg in altri metodi, e' inutile e uno spreco che tu lo metta in "self".
2) readline() se non erro prende anche i "\n", quindi se hai una riga vuota, non e' nulla, e di conseguenza riesci a discriminare tra "riga vuota" e "fine file".
--
-gaspa-
Avatar utente
Ivan!
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1560
Iscrizione: sabato 21 giugno 2008, 12:24

Re: [PYTHON] Leggere una riga a volta

Messaggio da Ivan! »

non avevo visto la tua risposta, perchè non avevo aggiornato la pagina ;D
comunque ho fatto come dici tu..
sisi giusto infatti adesso ho usato

Codice: Seleziona tutto

	def refresh( self ):
		'''refresh the personal message with the new message'''
			
		self.msg = self.mess_file.readline()
		
		if self.msg != "":
			self.controller.contacts.set_message(self.msg)	
			
		else:
			self.mess_file.seek(0)
			self.msg = self.mess_file.readline()
			self.controller.contacts.set_message(self.msg)	
			
		
		return True
perchè mi viene scritto "inserire un messaggio", su emesene, quindi vuol dire che non legge niente allora ho pensato a fare if != ""

inoltre il self lo devo mettere per forza...

Ecco però come mi dici tu giustamente, mi prende anche i caratteri di ritorno a capo come potrei fare??

grazie :)
Ultima modifica di Ivan! il lunedì 8 settembre 2008, 11:15, modificato 1 volta in totale.
Avatar utente
marko782
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 284
Iscrizione: sabato 24 marzo 2007, 12:53
Località: Monza (MI)

Re: [PYTHON] Leggere una riga a volta

Messaggio da marko782 »

Attento che il self non ti è obbligatorio per forza in questo caso. Come ti accennavo ieri ti sarà un pò difficile (neanche tanto...) familiarizzare con la programmazione ad oggetti ma poi sarai molto soddisfatto ;D

Comunque per rimuovere il carattere di ritorno a capo (\n) dovresti fare così:

Codice: Seleziona tutto

self.msg = self.mess_file.readline()
self.msg = self.msg[:-1]
Usando le parentesi quadre puoi dire a python di prendere soltanto "una fetta" della stringa, partendo da un inizio (prima dei 2 punti) arrivando fino a una fine (dopo i 2 punti). In questo caso ho omesso il punto d' inizio (quindi parte dall' inizio, mi segui ::) (rotfl) ) e come fine ho detto di usare il penultimo carattere (saltando quindi \n).

Prova e facci sapere ;D
Avatar utente
Ivan!
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1560
Iscrizione: sabato 21 giugno 2008, 12:24

Re: [PYTHON] Leggere una riga a volta

Messaggio da Ivan! »

uffa mi avete anticipato ancora...devo aggiornare la pagina più spesso... ;D  :P

cmq si ho fatto così  :)

Codice: Seleziona tutto

	def refresh( self ):
		'''refresh the personal message with the new message'''
			
		self.msg = self.mess_file.readline()
		self.msgok = self.msg[:-1]					#Toglie l'ultimo carattere di ritorno a capo
		
		if self.msg != "":
			self.controller.contacts.set_message(self.msgok)	#Cambia il messaggio personale in self.msgok	
			
		else:
			self.mess_file.seek(0)
			self.msg = self.mess_file.readline()
			self.msgok = self.msg[:-1]				#Toglie l'ultimo carattere di ritorno a capo
			self.controller.contacts.set_message(self.msgok)	#Cambia il messaggio personale in self.msgok	
			
		
		return True
questo è il codice finito

e funge...
adesso manca solo l'interfaccia grafica per scegliere il percorso del file e ogni quanti secondi aggiornare...
e sarà difficile penso  :)

metto [RISOLTO] nel titolo
e grazie a tutti :)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti