← Все вопросы

Как правильно читать и записывать файлы в Python, чтобы не "забыть" их закрыть?

Задан 2 месяца назад21 просмотров1 ответ
1

Что такое контекстный менеджер with open()? Почему это безопаснее, чем просто open() и close()? Приведите пример чтения CSV или текстового файла и записи результата.

1 ответ

2

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 написан за вас.

Ваш ответ

, чтобы ответить на вопрос.