Как правильно читать и записывать файлы в Python, чтобы не "забыть" их закрыть?
Что такое контекстный менеджер with open()? Почему это безопаснее, чем просто open() и close()? Приведите пример чтения CSV или текстового файла и записи результата.
1 ответ
with open(...) — это менеджер контекста: он гарантирует, что файл закроется при любом выходе из блока — нормальном, через return или через исключение.
Пара open()/close() такой гарантии не даёт: вылетело исключение между ними — close() не выполнился, файл повис открытым. На чтении это обычно сходит с рук, а незакрытый файл на записи — риск потерять хвост данных, который сидел в буфере.
Шаблоны на каждый день:
# прочитать текстовый файл построчно
with open('input.txt', encoding='utf-8') as f:
for line in f:
process(line.strip())
# записать результат
with open('result.txt', 'w', encoding='utf-8') as f:
for row in rows:
f.write(row + '\n')
# csv
import csv
with open('data.csv', newline='', encoding='utf-8') as f:
for row in csv.reader(f):
print(row[0])
Два прикладных совета. encoding='utf-8' пишите явно — на Windows иначе получите cp1251 и кракозябры. Для csv нужен newline='' — без него на той же Windows между записями появляются пустые строки.
По сути with — это укороченный try/finally, где f.close() в finally написан за вас.