Работа с файлами: JSON и CSV: вопросы для собеседования (часть 2)
Чтение и запись CSV, парсинг JSON, контекстный менеджер with open — повседневные задачи аналитика. На собеседовании могут попросить прочитать CSV без pandas, распарсить вложенный JSON или объяснить разницу между json.load и json.loads. Эти навыки показывают, что кандидат не привязан к одной библиотеке.
Вопросы 6–10 из 20
6Что гарантирует конструкция `with open("data.csv", "r") as f:` при чтении файла в Python?
AФайл с указанным именем будет автоматически создан, если его нет на диске на момент открытия
BФайл целиком загрузится в память сразу при входе в блок, без явного вызова метода `f.read()`
CПо умолчанию выбирается кодировка `utf-8` для чтения файла, даже без явного параметра `encoding`
DФайл будет автоматически закрыт после выхода из блока, даже если внутри возникнет исключение
Ответ: `with` гарантирует корректное закрытие файла после выхода из блока.
Контекстный менеджер `with open(...) as f` гарантирует, что файл будет закрыт при выходе из блока, даже если во время чтения или обработки данных произошло исключение. Это снижает риск утечек файловых дескрипторов и проблем с блокировками. Файл при этом не создаётся автоматически в режиме `"r"` — будет ошибка `FileNotFoundError`. Кодировка по умолчанию зависит от системы, и `with` сам её не фиксирует — её задают через параметр `encoding=...`.
Подробный разбор → 7Что произойдёт при выполнении вызова `open("missing.csv", "r")`, если файла `missing.csv` не существует в текущей директории?
AСоздастся пустой файл и автоматически откроется в режиме `r` для последующего чтения
BФайл будет автоматически перезаписан в режиме `w` с пустым содержимым вместо режима `r`
CБудет выброшено исключение `FileNotFoundError` без создания файла на диске
DВернётся объект-заглушка с пустым содержимым типа `bytes` для совместимости
Ответ: Режим `r` требует, чтобы файл уже существовал, иначе будет исключение `FileNotFoundError`.
При вызове `open("missing.csv", "r")` Python пытается открыть существующий файл для чтения. Если файла нет, это считается ошибкой, и возникает `FileNotFoundError`. Никаких автоматических действий типа создания пустого файла или возврата заглушки не происходит. Чтобы создать файл при отсутствии, используют режим `w` (перезаписать или создать) или `a` (создать или дописать).
Подробный разбор → 8Вы хотели дописать новые строки в существующий файл `report.txt`, но открыли его как `open("report.txt", "w")`. Что произойдёт?
AНовые строки допишутся в конец, старое содержимое сохранится: режим `w` ведёт себя как режим добавления
BФайл будет очищен и перезаписан с начала: содержимое исчезнет, потому что `w` обнуляет файл при открытии
CБудет ошибка времени выполнения: режим `w` для текстовых файлов с расширением `.txt` запрещён, нужен `wt`
DФайл откроется только для чтения: попытка записи вызовет исключение `io.UnsupportedOperation`
Ответ: Режим `w` всегда очищает файл, если он уже существует, и запись начинается с нуля.
Открытие файла через `open("report.txt", "w")` приводит к перезаписи: содержимое файла обнуляется, и запись начинается заново. Это частая ошибка, когда нужно было дописать в конец. Для дописывания используют `open("report.txt", "a")` (режим добавления), а для безопасной работы — обычно в связке с менеджером контекста `with`. Ошибки или режима «только чтение» здесь не будет.
Подробный разбор → 9Код: `with open("data.txt", "r", encoding="utf-8") as f: content = f.read()`. После выхода из блока вы делаете `f.read()` ещё раз. Что произойдёт?
AФайл уже закрыт после выхода из блока `with`, повторный `f.read()` поднимет ошибку `ValueError`
BФайл автоматически переоткроется в том же режиме, и `f.read()` вернёт прежнее содержимое
CВернётся пустая строка `''` из-за положения курсора `f` в конце файла после первого чтения
DБудет возвращён `None` без ошибки, поскольку `with` подменяет `f` на безопасную заглушку
Ответ: После выхода из блока `with` файл закрыт, и любые операции через `f` приводят к `ValueError`.
Менеджер контекста `with open(...) as f` гарантированно закрывает файл при выходе из блока. После этого попытка чтения через `f` поднимает `ValueError: I/O operation on closed file`. Файл сам не переоткрывается, дескриптор не подменяется на заглушку, и пустая строка тоже не возвращается. Если данные нужны повторно — сохраняйте их в переменную `content` или открывайте файл заново.
Подробный разбор → 10В аналитическом скрипте вы делаете `f = open("out.csv", "w")` и иногда забываете вызвать `f.close()`. Как лучше всего избежать таких ошибок и гарантировать закрытие файла?
AХранить `f` в глобальной переменной модуля и закрывать в самом конце скрипта
BПолагаться на ОС и буфер: после `f.write(...)` система сама сбрасывает данные
CОткрывать файл в режиме `a` (append): данные сохраняются, закрытие не нужно
DИспользовать `with open("out.csv", "w", encoding="utf-8") as f:` для гарантии
Ответ: Контекстный менеджер `with` гарантирует закрытие файла даже при возникновении исключения.
Если открывать файл вручную, легко забыть `f.close()`, особенно если в середине кода есть исключения или ранние `return`. Лучший практический подход — использовать `with open(...) as f`, тогда закрытие файла гарантируется автоматически даже при ошибке. Это важно и для корректного сброса данных на диск (flush), и для отсутствия блокировок файла при последующих чтениях. Глобальная переменная или режим `a` сами по себе не закрывают файл, а ОС не гарантирует своевременное закрытие.
Подробный разбор →