Тест самоперевірки

CSV і JSON

Обери відповідь — і одразу побачиш пояснення. Помилитись тут корисніше, ніж на іспиті.

← до лекції
Відповіді0 / 8   правильних: 0
Питання 1 / 8

Рядок файлу виглядає так: Капучино,45,кава,"молоко, кориця". Що поверне рядок.split(",")?

Чому так. Метод split нічого не знає про лапки — він ріже по кожній комі, тому полів виходить пʼять: ʼ"молокоʼ і ʼ кориця"ʼ окремо. Найгірше, що помилки не буде: ціна й категорія залишаться на своїх місцях, і програма спокійно працюватиме з побитими даними. Саме тому розбір роблять модулем csv, а не рядковими методами.
Питання 2 / 8

Тобі надіслали файл з українського Excel — стовпці розділені крапкою з комою. Ти читаєш його через csv.reader(файл), без аргументів. Що станеться?

Чому так. Роздільник за замовчуванням — кома, і читач слухняно поріже рядок саме по комах. Ком у такому файлі майже немає, тому весь рядок повертається як одне велике поле. Ніякого винятку: помилку ти побачиш аж у результатах. Автовизначення діалекту існує (csv.Sniffer), але вручну вказати delimiter=ʼ;ʼ надійніше.
Питання 3 / 8

Навіщо файл для модуля csv відкривають із newline=""?

Чому так. Модуль csv сам вирішує, чим завершувати рядок (за замовчуванням \r\n). Якщо текстовий режим ще й перетворить \n на \r\n, у файлі вийде \r\r\n — зайвий порожній рядок між записами. При читанні та сама вказівка не дає розірвати поле, усередині якого є перенос рядка. За кодування відповідає окремий аргумент encoding.
Питання 4 / 8

У словнику є ключ "теги", під яким лежить кортеж ("кава", "знижка"). Словник записали через json.dump і прочитали через json.load. Що тепер під цим ключем?

Чому так. Кортеж і список у JSON пишуться однаково — масивом, тому зворотний шлях один: array → list. Вміст не змінився, а тип змінився мовчки. Практичний наслідок: якщо цей кортеж десь був ключем словника, після подорожі у файл він стане списком і ключем бути вже не зможе.
Питання 5 / 8

Розробник забув ensure_ascii=False і записав український текст у JSON. Що сталося з даними?

Чому так. ensure_ascii=True — це лише інший спосіб записати ті самі символи: кожна українська літера перетворюється на екранування \uXXXX, тобто на шість символів. JSON лишається коректним, і будь-який парсер поверне з нього ті самі дані. Втрачається не інформація, а читабельність — і разом із нею можливість шукати по файлу очима або grep-ом.
Питання 6 / 8

Словник {1: "перший"} записали в JSON, прочитали назад і звернулись до дані[1]. Що буде?

Чому так. У JSON ключем обʼєкта може бути тільки рядок, тому Python при записі мовчки перетворює 1 на "1" (а None — на "null", True — на "true"). Помилки немає ані при записі, ані при читанні — вона виринає аж на зверненні за старим ключем. Якщо ключі числові, переводь їх у рядки свідомо, щоб не шукати потім цю пастку.
Питання 7 / 8

У CSV-файлі один рядок коротший за інші — бракує останнього стовпця. Що зробить csv.DictReader?

Чому так. DictReader підставляє restval, а він за замовчуванням None — і мовчки віддає неповний запис. Зайві поля він теж не викидає: складає їх у список під ключем None. Тому CSV небезпечніший за JSON: JSON падає голосно з JSONDecodeError, а CSV пускає криві дані далі, і перевірку доводиться писати самому.
Питання 8 / 8

Треба зберігати мільйони подій, дописуючи їх по одній. Чому один великий JSON-масив — погана ідея й що беруть замість нього?

Чому так. Перевірити коректність JSON можна лише дочитавши до останньої дужки, тому json.load піднімає в памʼять увесь файл, а потім ще й дерево обʼєктів Python, яке важить більше за текст. Дописати запис у кінець теж не вийде — треба переписувати закривальну дужку. JSON Lines знімає обидві проблеми: файл читається порядково, а новий запис просто додається в кінець.