Você pode ler o arquivo inteiro e dividir linhas usando str.splitlines
:
temp = file.read().splitlines()
Ou você pode retirar a nova linha manualmente:
temp = [line[:-1] for line in file]
Nota: esta última solução funciona apenas se o arquivo terminar com uma nova linha, caso contrário, a última linha perderá um caractere.
Esta suposição é verdade na maioria dos casos (especialmente para arquivos criados por editores de texto, que muitas vezes fazer adicionar uma nova linha terminando de qualquer maneira).
Se você deseja evitar isso, pode adicionar uma nova linha no final do arquivo:
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]
Ou uma alternativa mais simples é strip
a nova linha:
[line.rstrip('\n') for line in file]
Ou ainda, embora bastante ilegível:
[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
O que explora o fato de que o valor de retorno de or
não é um booleano, mas o objeto que foi avaliado como verdadeiro ou falso.
O readlines
método é realmente equivalente 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
Desde readline()
mantém a nova linha também readlines()
mantém.
Nota: a simetria readlines()
no writelines()
método não adiciona novas linhas finais, f2.writelines(f.readlines())
produz uma cópia exata de f
in f2
.
[l.strip('\n\r') for l in temp]
. Ou atérstrip
. E já que a iteração aqui pode ser emin open
vez dein temp
.