Discussione:
Eliminare una o + linee
(troppo vecchio per rispondere)
luca72
2006-11-24 15:52:59 UTC
Permalink
Salve
Ho un txt con una o più righe anche consecutive che hanno solo \r\n
per eliminarle ho fatto questo:
file = open('miofile.txt', 'r')
leggo = file.readlines()
lunghezza = len(leggo)
a = 0
while a < lunghezza:
if leggo[a] == '\r\n':
del leggo[a]
lunghezza = lunghezza -1
a -=1
a +=1
file.close()
file =open('mifile.txt', 'w')
file.writelines(leggo)
file.close

che funziona ma è lungo.

Avevo provato a fare questo:
file = open('miofile', 'r+')
for line in file:
if line == '\r\n'
del line

Ma non ottengo nessun cambiamento

se invece apro il fille in 'w+' mi si cancella tutto dove sbaglio

Saluti

Luca
Y3s
2006-11-24 15:57:11 UTC
Permalink
Post by luca72
Salve
Ho un txt con una o più righe anche consecutive che hanno solo \r\n
Non si possono eliminare righe da files (a meno che non siano alla fine),
l'unico modo copiare in un file temporaneo solo ciò che serve, poi
eliminare il file di origine e rinominare il nuovo. Oppure, se il file è
piccolo, mettere tutto in memoria e riscriverlo sullo stesso file.
Lawrence Oluyede
2006-11-24 15:58:46 UTC
Permalink
Post by luca72
file = open('miofile.txt', 'r')
leggo = file.readlines()
lunghezza = len(leggo)
a = 0
del leggo[a]
lunghezza = lunghezza -1
a -=1
a +=1
file.close()
file =open('mifile.txt', 'w')
file.writelines(leggo)
file.close
che funziona ma è lungo.
e super macchinoso direi :-)
Post by luca72
file = open('miofile', 'r+')
if line == '\r\n'
del line
Ma non ottengo nessun cambiamento
Questo perché tu cancelli l'esistenza della variabile line (tra l'altro
quella variabile assume un valore diverso a ogni iterazione). Non fai un
bel niente al tuo file.

Suggerimento (non ho proprio voglia di aprire la shell oggi :P):

1 - apri il file in lettura (il + non ti serve a niente)
2 - leggi tutto il contenuto del file in una variabile d'appoggio
3 - usi splitlines() per mettere le linee in una lista (senza \r\n)
4 - apri un nuovo file in scrittura
5 - scrivi il contenuto come ti pare.

Se il file è grosso grosso non leggerlo tutto in un colpo ma usa una
linea alla volta o che e usa una lista d'appoggio per memorizzare il
contenuto.
--
Lawrence - http://www.oluyede.org/blog
http://www.neropercaso.it
"Nothing is more dangerous than an idea
if it's the only one you have" - E. A. Chartier
Nicola Larosa
2006-11-24 17:54:04 UTC
Permalink
Cosa devono sentire le mie orecchie?!? Non tieni un ipython sempre
attivo?!? Vergogna! B-P
--
Nicola Larosa - http://www.tekNico.net/

Un intero senza segno a 32 bit basta per contare tutti i secondi
nella tua vita. (Anche uno *con* segno, se sei sfortunato.)
-- Nicola Larosa, Giugno 2006
b***@lycos.com
2006-11-24 16:22:12 UTC
Permalink
Post by luca72
Ho un txt con una o più righe anche consecutive che hanno solo \r\n
Puoi provare con questo:

from fileinput import input as finput
for line in finput("miofile.txt", inplace=True):
if line.strip():
print line,

Ma spesso e' positivo tenere anche una copia di sicurezza del file
originale:

from fileinput import input as finput
for line in finput("miofile.txt", inplace=True, backup=".bak"):
if line.strip():
print line,

Salve,
bearophile
Alex Martelli
2006-11-24 19:14:02 UTC
Permalink
Post by luca72
Salve
Ho un txt con una o più righe anche consecutive che hanno solo \r\n
file = open('miofile.txt', 'r')
Consiglio generale: non usare MAI i nomi di tipi e funzioni builtin
(come file, list, type, tuple, set, sum, eccetera) come "normali
identificatori" per tue variabili (o funzioni o classi) -- e` solo un
andare a cercarsi rogne, senza nessun risvolto positivo.
Post by luca72
leggo = file.readlines()
lunghezza = len(leggo)
a = 0
del leggo[a]
lunghezza = lunghezza -1
a -=1
a +=1
file.close()
file =open('mifile.txt', 'w')
file.writelines(leggo)
file.close
che funziona ma è lungo.
lines = [ line for line in open('miofile.txt') if line != '\r\n' ]
thefile = open('miofile.txt', 'w')
thefile.writelines(lines)
thefile.close()

O, se hai Python 2.5, magari qualche variante del tipo:

from __future__ import with_statement

with open('miofile.txt') as f:
lines = [ line for line in f if line != '\r\n' ]
f.seek(0, 0)
f.writelines(lines)

ma in questo caso preferisco la prima variante, che apre esplicitamente
il file due volte (prima in lettura, poi in scrittura).

In ogni caso, l'idea fondamentale e` quella di preparare la lista delle
righe da (ri)scrivere "costruttivamente", con una list comprehension (ma
anche un loop esplicito andrebbe bene, e` solo inutilmente meno
conciso), NON mettendo prima tutte le righe in una lista per poi andare
a cancellare quelle che sono da rimuovere. L'approccio costruttivo
(tipico della programmazione funzionale -- apposta Python ha copiato le
list comprehension da Haskell!-) ha molti vantaggi.


Alex
danza
2006-11-24 20:22:19 UTC
Permalink
Post by luca72
Salve
Ho un txt con una o più righe anche consecutive che hanno solo \r\n
[...]
fi=file("testo0.txt", "r")
fo=file("testo1.txt", "w")
if riga.strip(): fo.write(riga)
Post by luca72
fo.close()
In questo modo comunque creo un nuovo file depurato dalle righe vuote,
eventualmente si può rinominare o cancellare il file di partenza.

Ciao

Daniele
luca72
2006-11-24 21:35:29 UTC
Permalink
Grazie a tutti mi avete insegnato un sacco di cose

Luca

Continua a leggere su narkive:
Loading...