Работа с файлами: JSON и CSV: вопросы для собеседования (часть 3)
Чтение и запись CSV, парсинг JSON, контекстный менеджер with open — повседневные задачи аналитика. На собеседовании могут попросить прочитать CSV без pandas, распарсить вложенный JSON или объяснить разницу между json.load и json.loads. Эти навыки показывают, что кандидат не привязан к одной библиотеке.
Вопросы 11–15 из 20
11CSV-экспорт из системы разделён точкой с запятой `;`. Как корректно прочитать его через `csv.reader`?
A`reader = csv.reader(f)`
B`reader = csv.reader(f, delimiter=",")`
C`reader = csv.reader(f, delimiter=";")`
D`reader = csv.reader(f, encoding="utf-8")`
Ответ: Если разделитель не запятая, укажите его через `delimiter`.
По умолчанию `csv.reader` ожидает запятую как разделитель. Если файл разделён `;`, нужно явно указать `delimiter=";"`. Это особенно важно для аналитических экспортов из разных систем (например, CRM/ERP), где формат CSV может отличаться.
12Есть строка `text = '{"user_id": 7, "active": true}'`. Что вернёт `json.loads(text)`?
AТу же строку `text` без изменений
BБайты (тип `bytes`)
CPython-словарь `{'user_id': 7, 'active': True}`
DОткрытый файл, из которого был прочитан JSON
Ответ: `json.loads()` превращает JSON-строку в Python-объект.
`json.loads(text)` разбирает JSON-текст (строку) и возвращает соответствующий Python-объект: словарь, список, числа и т.д. В данном примере JSON-объект превращается в `dict`, а значение `true` становится `True`. Это отличается от `json.dumps()`, который делает обратное — превращает Python-объект в 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`with open("config.json", "r") as f: text = f.read()`
B`with open("config.json", "r", encoding="utf-8") as f: text = f.read()`
C`with open("config.json", "a", encoding="utf-8") as f: text = f.read()`
D`with open("config.json", "w", encoding="utf-8") as f: text = f.read()`
Ответ: Явно задавайте `encoding="utf-8"` при чтении текстовых файлов.
Кодировка по умолчанию зависит от ОС и окружения, поэтому чтение файла с кириллицей без указания `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`
CПустая строка, потому что указатель уже в конце файла
DСписок строк, как будто использовали `csv.reader`
Ответ: После `f.read()` указатель оказывается в конце файла.
`f.read()` читает данные до конца и сдвигает позицию чтения. Повторный вызов `f.read()` сразу после первого обычно вернёт пустую строку, потому что читать больше нечего. Если нужно прочитать файл заново, переустановите позицию через `f.seek(0)` или откройте файл снова (желательно через `with open(...)`).
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram