Работа с файлами: JSON и CSV: вопросы для собеседования (часть 3)

Чтение и запись CSV, парсинг JSON, контекстный менеджер with open — повседневные задачи аналитика. На собеседовании могут попросить прочитать CSV без pandas, распарсить вложенный JSON или объяснить разницу между json.load и json.loads. Эти навыки показывают, что кандидат не привязан к одной библиотеке.

Коллекции и структуры данныхГенераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаФункции и аргументыИтераторы и генераторыNumPy: основыPandas и DataFrameСинтаксис и типы данных

Вопросы 1115 из 20

11CSV-экспорт из системы разделён точкой с запятой `;` вместо запятой. Как корректно прочитать его через `csv.reader`?
A`reader = csv.reader(f)` без указания разделителя полей при создании объекта
B`reader = csv.reader(f, delimiter=',')` с явным указанием запятой как разделителя
C`reader = csv.reader(f, encoding='utf-8')` с указанием кодировки в самом ридере
D`reader = csv.reader(f, delimiter=';')` с явным указанием точки с запятой
Ответ: Если разделитель не запятая, его нужно явно указать через параметр `delimiter`.

По умолчанию `csv.reader` ожидает запятую как разделитель. Если файл разделён `;`, нужно явно указать `delimiter=';'`. Кодировка задаётся не в `csv.reader`, а в `open()` — например, `open(path, encoding='utf-8')`. Это особенно важно для аналитических экспортов из разных систем (например, CRM или ERP), где формат CSV может отличаться по разделителю и кодировке.

Подробный разбор →
12Есть строка `text = '{"user_id": 7, "active": true}'`. Что вернёт `json.loads(text)`?
AТу же строку `text` без изменений: функция `loads()` не парсит ввод и возвращает аргумент как есть
BОбъект типа `bytes` с содержимым исходной строки `text`: без преобразования типов значений внутри
CPython-словарь `{'user_id': 7, 'active': True}`: JSON-объект превращается в `dict`, `true` в `True`
DФайловый объект, открытый из `text`: поведение `load()` для файла вместо парсинга строки `loads()`
Ответ: `json.loads()` превращает JSON-строку в Python-объект.

`json.loads(text)` разбирает JSON-текст (строку) и возвращает соответствующий Python-объект: словарь, список, числа и так далее. В данном примере JSON-объект превращается в `dict`, а значение `true` становится `True`. Это отличается от `json.dumps()`, который делает обратное — превращает Python-объект в JSON-строку, и от `json.load()`, который читает JSON из файлового объекта, а не из строки.

Подробный разбор →
13Вы читаете CSV с заголовком через `csv.DictReader(f)`. Что представляет собой `row` внутри цикла `for row in csv.DictReader(f):`?
AСписок значений без имён столбцов (как у `csv.reader`)
BОдна строка CSV целиком (тип `str`)
CПара `("header", "values")` для каждой строки
DСловарь: ключи — названия столбцов, значения — ячейки строки
Ответ: `csv.DictReader` отдаёт строки как словари по именам столбцов.

`csv.DictReader(f)` использует первую строку файла как заголовок и затем возвращает каждую строку как словарь. Ключи — названия столбцов, а значения — строки из соответствующих ячеек. Это удобно в аналитике, когда нужно обращаться к полям по имени (например, `row["price"]`), а не по индексу.

Подробный разбор →
14При чтении файла `config.json` с кириллицей на некоторых системах вы получаете `UnicodeDecodeError`. Какой вариант чтения наиболее устойчивый?
A`open("config.json", "r")` без явного `encoding`: кодировка зависит от ОС и окружения
B`open("config.json", "r", encoding="utf-8")`: режим чтения с явной кодировкой `utf-8`
C`open("config.json", "a", encoding="utf-8")`: режим `a` для дозаписи в конец файла
D`open("config.json", "w", encoding="utf-8")`: режим `w` для записи и перезаписи файла
Ответ: Явно указывайте `encoding="utf-8"` и режим `r` при чтении текстовых файлов с кириллицей.

Кодировка по умолчанию у `open` зависит от ОС и окружения, поэтому чтение файла с кириллицей без явного `encoding` может приводить к `UnicodeDecodeError`. Для текстовых данных и конфигов обычно подходит `encoding="utf-8"`. Также важно использовать режим `r` для чтения: режимы `w` и `a` предназначены для записи и не подходят для `f.read()`.

Подробный разбор →
15Что окажется в переменной `second` после выполнения `with open("users.csv", "r", encoding="utf-8") as f: first = f.read(); second = f.read()`?
AСодержимое файла прочитается заново и будет точно совпадать со значением переменной `first`
BБудет значение `None`, потому что после первого `f.read()` файловый объект перестаёт быть валидным
CБудет пустая строка, потому что указатель чтения уже находится в конце файла после `first`
DБудет список строк, как если бы файл был прочитан через `csv.reader` или метод `readlines`
Ответ: После `f.read()` указатель оказывается в конце файла, и повторный вызов вернёт пустую строку.

`f.read()` без аргументов читает файл до конца и сдвигает позицию чтения в самый конец. Повторный вызов `f.read()` сразу после первого вернёт пустую строку, потому что читать уже нечего. Если нужно прочитать файл заново, верните указатель в начало через `f.seek(0)` или откройте файл повторно через `with open(...)`. Файловый объект остаётся валидным, никакого `None` или списка строк здесь не возникает.

Подробный разбор →
1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать Python в Telegram

Другие темы: Python

Коллекции и структуры данныхГенераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаФункции и аргументыИтераторы и генераторыNumPy: основыPandas и DataFrameСинтаксис и типы данных