Możesz odczytać cały plik i linie podziału za pomocą str.splitlines
:
temp = file.read().splitlines()
Lub możesz ręcznie usunąć nową linię:
temp = [line[:-1] for line in file]
Uwaga: to ostatnie rozwiązanie działa tylko wtedy, gdy plik kończy się na nowej linii, w przeciwnym razie ostatnia linia straci znak.
To założenie jest prawdziwe w większości przypadków (szczególnie w przypadku plików utworzonych przez edytorów tekstowych, które często zrobienia dodać kończący znak nowej linii w każdym razie).
Jeśli chcesz tego uniknąć, możesz dodać nowy wiersz na końcu pliku:
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]
Lub prostszą alternatywą jest strip
zamiast nowej linii:
[line.rstrip('\n') for line in file]
Lub nawet, chociaż dość nieczytelne:
[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
Który wykorzystuje fakt, że zwracana wartość or
nie jest wartością logiczną, ale obiektem, który został oceniony jako prawda lub fałsz.
readlines
Metoda jest rzeczywiście równoważne:
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
Ponieważ readline()
utrzymuje nową linię, również readlines()
ją utrzymuje.
Uwaga: dla symetrii do readlines()
tej writelines()
metody jest nie dodać kończące znaki nowej linii, więc f2.writelines(f.readlines())
tworzy dokładną kopię f
w f2
.
[l.strip('\n\r') for l in temp]
. Lub nawetrstrip
. A ponieważ iteracja tutaj może byćin open
zamiastin temp
.