Ви можете прочитати весь файл та розділити рядки, використовуючи str.splitlines
:
temp = file.read().splitlines()
Або ви можете зняти нову лінію вручну:
temp = [line[:-1] for line in 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]
Або ж більш простою альтернативою є strip
новий рядок:
[line.rstrip('\n') for line in file]
Або навіть, хоча досить нечитабельно:
[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
Що використовує той факт, що повернене значення or
не булеве, а об'єкт, який оцінювався як істинне чи помилкове.
readlines
Метод фактично еквівалентно:
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
Оскільки readline()
зберігає новий рядок, він також readlines()
зберігає його.
Примітка: для симетрії до readlines()
в writelines()
методі зовсім НЕ додавати закінчення перекладу рядка, тому f2.writelines(f.readlines())
виробляє точну копію f
в f2
.
[l.strip('\n\r') for l in temp]
. Або навітьrstrip
. А оскільки ітерація тут може бутиin open
замістьin temp
.