Чому я не в змозі використовувати рядок для нового рядка в write (), але я можу використовувати його в написанні ()?
Ідея така: якщо ви хочете написати один рядок, ви можете це зробити write()
. Якщо у вас є послідовність рядків, ви можете записати їх усі, використовуючи writelines()
.
write(arg)
очікує рядок як аргумент і записує його у файл. Якщо ви надасте список рядків, це створить виняток (до речі, покажіть нам помилки!).
writelines(arg)
очікує ітерабельний аргумент (ітерабельним об'єктом може бути кортеж, список, рядок або ітератор у найбільш загальному сенсі). Очікується, що кожен елемент, що міститься в ітераторі, буде рядком. Набір струн - це те, що ви надали, щоб все працювало.
Характер рядків (ив) не має значення для обох функцій, тобто вони просто записують у файл все, що ви їм надаєте. Цікава частина полягає в тому, що writelines()
вони не додають символи нового рядка самостійно, тому назва методу насправді може бути досить заплутаною. Він насправді веде себе як уявний метод, який називається write_all_of_these_strings(sequence)
.
Далі йде ідіоматичний спосіб у Python написати список рядків у файл, зберігаючи кожну рядок у своєму рядку:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
Це допоможе закрити файл для вас. Конструкція '\n'.join(lines)
об'єднує (з'єднує) рядки у списку lines
та використовує символ '\ n' як клей. Це більш ефективно, ніж використання +
оператора.
Починаючи з тієї ж lines
послідовності, закінчуючи тим самим висновком, але використовуючи writelines()
:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
Це використовує генераторний вираз і динамічно створює рядки, що закінчуються новим рядком. writelines()
повторює цю послідовність рядків і записує кожен елемент.
Редагування: Ще один момент, про який слід знати:
write()
і readlines()
існували раніше, коли writelines()
було введено. writelines()
пізніше було представлено як аналог readlines()
, щоб можна було легко записати вміст файлу, який щойно читали через readlines()
:
outfile.writelines(infile.readlines())
Дійсно, це головна причина, чому writelines
вона має таку заплутану назву. Також сьогодні ми дуже не хочемо більше використовувати цей метод. readlines()
зчитує весь файл в пам'ять вашого апарату, перш ніж writelines()
починає записувати дані. Перш за все, це може втратити час. Чому б не почати писати частини даних під час читання інших частин? Але, найголовніше, такий підхід може бути дуже трудомістким. У крайньому випадку, коли вхідний файл більший за об'єм пам'яті вашої машини, такий підхід навіть не працює. Рішення цієї проблеми полягає лише у використанні ітераторів. Робочий приклад:
with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)
Це читає вхідний файл рядок. Як тільки прочитається один рядок, цей рядок записується у вихідний файл. Схематично кажучи, у пам'яті завжди є лише один рядок (порівняно з усім вмістом файлу, який знаходиться в пам'яті, у випадку підходу readlines / pisceedines).
lines
не є рядком у вашому прикладі. Це кортеж, що складається з шести струн.