È possibile leggere le intere linee di file e split con str.splitlines
:
temp = file.read().splitlines()
Oppure si può spogliare il ritorno a capo a mano:
temp = [line[:-1] for line in file]
Nota: quest'ultima soluzione funziona solo se il il file termina con una nuova riga, altrimenti l'ultima riga perderà un carattere.
Questa ipotesi è vera nella maggior parte dei casi (in particolare per i file creati da editor di testo, che spesso do aggiungono comunque una nuova riga finale).
Se si vuole evitare questo si può aggiungere una nuova riga alla fine del file:
with open(the_file, 'r+') as f:
f.seek(-1, 2) # go at the end of the file
if f.read(1) != '\n':
# add missing newline if not already present
f.write('\n')
f.flush()
f.seek(0)
lines = [line[:-1] for line in f]
O un'alternativa più semplice è quello di strip
il ritorno a capo invece:
[line.rstrip('\n') for line in file]
O ancora, anche se piuttosto illeggibile:
[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
Che sfrutta il fatto che il ritorno va il valore di or
non è un valore booleano, ma l'oggetto che è stato valutato vero o falso.
Procedimento readlines
è in realtà equivale a:
def readlines(self):
lines = []
for line in iter(self.readline, ''):
lines.append(line)
return lines
# or equivalently
def readlines(self):
lines = []
while True:
line = self.readline()
if not line:
break
lines.append(line)
return lines
Poiché readline()
mantiene la nuova riga anche readlines()
mantiene.
Nota: per simmetria readlines()
metodo writelines()
non non aggiungere nuove righe termina, così f2.writelines(f.readlines())
produce una copia esatta del f
in f2
.
Uso striscia: '[l.strip ('\ n \ r') per l temp]'. O anche 'rstrip'. E poiché l'iterazione qui può essere 'in open' invece di' in temp'. – gorlum0
Questa domanda è responsabile per ogni punteggio di reputazione che ho – Yotam
Sarebbe bello se in Python 3 esistesse un valore per impostare l'argomento 'newline 'di open su quelle nuove di fine squarcio. – jxramos