Вспомните: в прошлой теме вы разложили «Загрузки» по папкам через pathlib и shutil. Файлы теперь лежат на местах. Пора заглянуть внутрь двух самых частых из них: таблицы расходов, которую вы ведёте в Excel, и файла настроек программы.
🎯 После урока сможете: прочитать выгрузку расходов из Excel в Python, посчитать суммы по статьям, записать результат обратно в CSV, который Excel откроет без кракозябр, и хранить настройки своей программы в JSON.
CSV — таблица в обычном текстовом файле
CSV — это таблица, записанная текстом: одна строка файла = одна строка таблицы, ячейки разделены знаком. Английский Excel ставит запятую, русский — точку с запятой, потому что запятая у нас занята под дробную часть (250,50). Вот выгрузка расходов, файл rashody.csv:
дата;статья;сумма
01.09;Еда;450
01.09;Такси;380
02.09;Еда;620
03.09;Связь;300
Резать такие строки через split(';') можно, но сломается на первой ячейке с кавычками или точкой с запятой внутри текста. В Python для этого есть встроенный модуль csv.
Проверьте себя
Контрольный вопрос. Вы сохранили таблицу из русского Excel как CSV. Какой разделитель укажете в delimiter?
Подсказка: Запятая в русских числах занята под дробную часть.
Онлайн-проверка ответа появится позже
csv.reader: строки как списки
import csv
from pathlib import Path
path = Path("rashody.csv")
with path.open(encoding="utf-8-sig", newline="") as f:
for row in csv.reader(f, delimiter=";"):
print(row)
['дата', 'статья', 'сумма']
['01.09', 'Еда', '450']
['01.09', 'Такси', '380']
['02.09', 'Еда', '620']
['03.09', 'Связь', '300']
path.open(...)— то же, чтоopen(path, ...): у объектаPathесть свой методopenс теми же режимами и параметрами.delimiter=";"— разделитель ячеек. Без негоcsvждёт запятую, и вся строка попадёт в одну ячейку.encoding="utf-8-sig"— UTF-8, который понимает метку BOM в начале файла. Excel её ставит при сохранении «CSV UTF-8». С обычнымutf-8первый заголовок прочитается как'\ufeffдата'.newline=""— так просит документация Python: переводы строк разбирает сам модульcsv.- Все ячейки приходят строками:
'450', а не450. Для счёта нужноint()илиfloat().
csv.reader принимает не только файл, а любой перебираемый набор строк — например обычный список. Это удобно, чтобы проверить разбор без файла:
import csv
lines = ["01.09;Еда;450"]
for row in csv.reader(lines, delimiter=";"):
print(row[2])
450
Проверьте себя
Задание. Что выведет программа? Введите число.
Исходный код для этого задания:
import csv lines = ["дата;статья;сумма", "01.09;Еда;450"] rows = list(csv.reader(lines, delimiter=";")) print(len(rows[1]))Подсказка: rows[1] — вторая строка таблицы, разбитая по ‘;’.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Задание. Программист забыл указать разделитель. Что выведет программа? Введите число.
Исходный код для этого задания:
import csv lines = ["01.09;Еда;450"] for row in csv.reader(lines): print(len(row))Подсказка: Без delimiter модуль csv ищет запятую. Есть ли запятая в строке?
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
csv.DictReader: строки как словари
Помнить, что сумма лежит в row[2], неудобно. DictReader берёт первую строку файла как заголовки и отдаёт каждую следующую строку словарём: ключ — заголовок столбца.

Считаем расходы по статьям — сквозная задача урока:
import csv
from pathlib import Path
totals = {}
with Path("rashody.csv").open(encoding="utf-8-sig", newline="") as f:
for row in csv.DictReader(f, delimiter=";"):
cat = row["статья"]
totals[cat] = totals.get(cat, 0) + int(row["сумма"])
print(totals)
{'Еда': 1070, 'Такси': 380, 'Связь': 300}
Какая статья самая дорогая? Функция max по словарю перебирает ключи. Без подсказки она сравнит сами названия, по алфавиту, и вернёт «Такси» — просто последнее слово по алфавиту. Чтобы сравнивались суммы, передайте в key функцию, которая по ключу возвращает число. Такая функция у словаря уже есть — totals.get. Скобки после get не ставим: мы отдаём max саму функцию, а вызывать её для каждой статьи он будет сам.
totals = {"Еда": 1070, "Такси": 380, "Связь": 300}
print(max(totals)) # сравнивает названия по алфавиту
top = max(totals, key=totals.get) # сравнивает totals.get(статья), то есть суммы
print(top, totals[top])
Такси
Еда 1070
Проверьте себя
Задание. Что выведет программа? Введите слово.
Исходный код для этого задания:
import csv lines = ["статья;сумма", "Такси;380", "Еда;620"] for row in csv.DictReader(lines, delimiter=";"): last = row["статья"] print(last)Подсказка: Первая строка — заголовки. В last остаётся значение из последней строки данных.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Программа должна сложить суммы, но падает с ошибкой TypeError. Значение какого выражения нужно обернуть в int()? Выберите вариант.
Исходный код для этого задания:
import csv lines = ["статья;сумма", "Еда;450", "Еда;620"] total = 0 for row in csv.DictReader(lines, delimiter=";"): total = total + row["сумма"] print(total)Подсказка: Все ячейки CSV приходят строками. Какое значение в сложении — строка?
Онлайн-проверка ответа появится позже
Задание. Сколько потрачено на статью «Еда»? Выполните программу в уме или у себя и введите число.
Исходный код для этого задания:
import csv lines = ["статья;сумма", "Еда;450", "Такси;380", "Еда;620", "Связь;300"] total = 0 for row in csv.DictReader(lines, delimiter=";"): if row["статья"] == "Еда": total += int(row["сумма"]) print(total)Подсказка: Складываются только строки, где статья равна ‘Еда’.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Задание. Программа ищет статью, на которую ушло больше всего денег. Что она выведет? Введите название статьи.
Исходный код для этого задания:
import csv lines = ["дата;статья;сумма", "01.09;Еда;450", "01.09;Такси;380", "02.09;Еда;620", "03.09;Связь;300", "04.09;Такси;900", "05.09;Связь;250"] totals = {} for row in csv.DictReader(lines, delimiter=";"): cat = row["статья"] totals[cat] = totals.get(cat, 0) + int(row["сумма"]) print(max(totals, key=totals.get))Подсказка: Сложите суммы по каждой статье, потом найдите наибольшую.
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
Онлайн-проверка ответа появится позже
Задание. В русском Excel дроби пишутся через запятую. Что выведет программа? Введите число так, как его напечатает Python.
Исходный код для этого задания:
import csv lines = ["дата;статья;сумма", "01.09;Еда;450,50", "02.09;Еда;99,50", "02.09;Кино;700"] total = 0 for row in csv.DictReader(lines, delimiter=";"): if row["статья"] == "Еда": total += float(row["сумма"].replace(",", ".")) print(total)Подсказка: replace меняет запятую на точку, чтобы float понял число. Сложите только строки статьи «Еда».
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
Онлайн-проверка ответа появится позже
csv.writer: записываем таблицу
Обратная дорога. writer.writerow(список) пишет одну строку, writerows(список_списков) — сразу много.
import csv
from pathlib import Path
totals = {"Еда": 1070, "Такси": 380, "Связь": 300}
with Path("itogi.csv").open("w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f, delimiter=";")
writer.writerow(["статья", "итого"])
for cat, total in totals.items():
writer.writerow([cat, total])
Файл itogi.csv откроется в русском Excel двойным щелчком: столбцы разойдутся по ячейкам, кириллица на месте.
Забыли
newline=""при записи на Windows — между строками таблицы появятся пустые строки. Забылиutf-8-sig— Excel покажет кракозябры вместо русских букв.
Проверьте себя
Контрольный вопрос. Excel открыл ваш CSV, но вместо русских букв кракозябры. Какую кодировку указать при записи файла?
Подсказка: Нужна кодировка с меткой BOM, по которой Excel узнаёт UTF-8.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Какая строка пишет в CSV-файл строку заголовков «статья;итого»? Выберите вариант.
Исходный код для этого задания:
import csv from pathlib import Path with Path("itogi.csv").open("w", encoding="utf-8-sig", newline="") as f: writer = csv.writer(f, delimiter=";") # здесь нужна строка заголовковПодсказка: writerow ждёт список ячеек, а не одну строку текста.
Онлайн-проверка ответа появится позже
Задание. Проектная миссия «Итоги месяца». Напишите утилиту: читает rashody.csv (содержимое целиком ниже, 52 строки данных) через csv.DictReader, считает сумму по каждой статье и записывает файл itogi.csv с заголовком «статья;итого» (utf-8-sig, разделитель ;, newline=»»), по строке на статью. Проверьте и на своей выгрузке из Excel. В поле ответа — итог по статье «Еда» для данных из условия. Приложите файл программы .py; в поле ответа — число.
Строки, которые начинаются с#, — пояснения к данным: в файлы их не копируйте.Принято, если:
1. введённое число совпадает с эталоном;
2. приложен файл .py, который это число выдаёт на данных из условия;Самопроверка перед сдачей (преподаватель смотрит на занятии):
3. файл читается через DictReader с delimiter=»;»;
4. itogi.csv открывается в Excel без кракозябр и пустых строк.# rashody.csv (кодировка utf-8-sig, разделитель
дата;статья;сумма
29.09;Подарки;492
24.09;Связь;713
25.09;Кино;2650
07.09;Подарки;2856
21.09;Кино;318
04.09;Аптека;3450
14.09;Одежда;319
24.09;Еда;2489
11.09;Одежда;1126
13.09;Подарки;3247
13.09;Одежда;2186
03.09;Такси;1001
02.09;Еда;2289
20.09;Кино;1459
25.09;Связь;2361
16.09;Кино;3214
23.09;Еда;1990
05.09;Подарки;1689
06.09;Одежда;2392
24.09;Такси;3286
26.09;Кино;135
08.09;Аптека;403
18.09;Кино;657
29.09;Подарки;1082
23.09;Подарки;846
26.09;Аптека;3204
30.09;Еда;3201
06.09;Аптека;1433
20.09;Кино;1343
29.09;Аптека;358
18.09;Еда;2879
06.09;Такси;1471
04.09;Подарки;1152
27.09;Аптека;2429
27.09;Одежда;684
10.09;Связь;1085
13.09;Одежда;2588
07.09;Еда;1346
12.09;Аптека;266
28.09;Такси;1823
24.09;Еда;619
05.09;Кино;613
06.09;Кино;2090
28.09;Одежда;2483
23.09;Такси;2353
28.09;Одежда;3358
26.09;Подарки;1418
01.09;Такси;241
10.09;Такси;1908
22.09;Аптека;376
08.09;Такси;476
21.09;Одежда;2396
Подсказка: Словарь totals: ключ — статья, значение — сумма; totals.get(cat, 0) + int(row[«сумма»]). Ответ — totals[«Еда»].
✅ Готово, если: ответ раскрывает то, что просит критерий приёмки в задании выше.
Онлайн-проверка ответа появится позже
JSON — файл настроек
CSV хорош для ровной таблицы. Для настроек программы — тема оформления, размер шрифта, список последних папок — нужна вложенность. Её даёт JSON: текстовый формат, который почти один в один повторяет словари и списки Python.
![Две колонки рядом: словарь Python и тот же объект в файле settings.json. 'тема': 'тёмная' соответствует "тема": "тёмная"; 'шрифт': 14 — "шрифт": 14; True — true; None — null; список ['a', 'b'] — ["a", "b"]. Ниже соответствия: dict — объект, list — массив, True/False — true/false, None — null. Внизу пометка: в JSON строки только в двойных кавычках.](https://victor-komlev.ru/wp-content/uploads/2026/09/g1-csv-python-json.png)
json.dump и json.load: сохранить и прочитать
import json
from pathlib import Path
settings = {"тема": "тёмная", "шрифт": 14, "последние": ["Загрузки"]}
path = Path("settings.json")
with path.open("w", encoding="utf-8") as f:
json.dump(settings, f, ensure_ascii=False, indent=2)
with path.open(encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["шрифт"] + 2)
16
ensure_ascii=False— русские буквы пишутся как есть. Без него в файле будет"\u0442\u0451\u043c...": работает, но читать глазами невозможно.indent=2— отступы и переносы, файл удобно править руками. Безindentвсё уйдёт в одну строку.dump/loadработают с файлом,dumps/loads(с буквой s — string) — со строкой.- Числа и логические значения возвращаются своими типами:
14— этоint, не строка, в отличие от CSV.
Первый запуск программы: файла настроек ещё нет. В этой главе проверяем это без исключений, через exists():
import json
from pathlib import Path
path = Path("settings.json")
if path.exists():
with path.open(encoding="utf-8") as f:
settings = json.load(f)
else:
settings = {"тема": "светлая", "шрифт": 12}
print(settings["тема"])
Создайте у себя
rashody.csvиз примера выше (или выгрузите свою таблицу из Excel: «Сохранить как → CSV UTF-8») и запустите код подсчёта по статьям.
Проверьте себя
Задание. Что выведет программа? Введите число.
Исходный код для этого задания:
import json text = '{"тема": "тёмная", "шрифт": 14}' settings = json.loads(text) print(settings["шрифт"] + 2)Подсказка: Число из JSON приходит числом, а не строкой.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Что выведет код? Выберите вариант.
Исходный код для этого задания:
import json print(json.dumps({'a': 1}))Подсказка: Вспомните, какие кавычки JSON использует для строк и ключей, в отличие от print(словаря).
Онлайн-проверка ответа появится позже
Контрольный вопрос. Что выведет программа? Выберите вариант.
Исходный код для этого задания:
import json print(json.dumps({"on": True, "path": None}))Подсказка: Посмотрите на картинку «Python ↔ JSON» в уроке: во что превращаются True и None.
Онлайн-проверка ответа появится позже
Задание. Программа печатает коды вида \u0442\u0451 вместо русских букв. Какой параметр нужно передать в json.dumps со значением False? Введите только имя параметра.
Исходный код для этого задания:
import json settings = {"тема": "тёмная"} print(json.dumps(settings))Подсказка: Параметр по умолчанию «гарантирует ASCII» в выводе.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Задание. Файл настроек записывается в одну строку, а нужно — с отступом в 2 пробела. Какое имя параметра стоит на месте ____? Введите одно слово.
Исходный код для этого задания:
import json settings = {"шрифт": 14} with open("settings.json", "w", encoding="utf-8") as f: json.dump(settings, f, ensure_ascii=False, ____=2)Подсказка: Параметр отвечает за отступы — вспомните пример json.dump из урока.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Задание. Сколько строк напечатает программа? Введите число.
Исходный код для этого задания:
import json print(json.dumps([1, 2], indent=2))Подсказка: Запустите код у себя или вспомните, как json.dump с indent расположил скобки и элементы в примере урока.
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
Онлайн-проверка ответа появится позже
Задание. Проектная миссия «Программа помнит себя». Программой пользуются несколько человек, счётчик запусков у каждого свой. Напишите функцию run(user): если settings.json есть (проверка через exists()) — читает его json.load, иначе берёт настройки по умолчанию {«тема»: «светлая», «запусков»: {}}. Затем увеличивает счётчик этого пользователя на 1 (нового пользователя заводит с нуля), печатает приветствие с номером запуска и сохраняет файл обратно (ensure_ascii=False, indent=2).
Исходный settings.json и журнал запусков — ниже: вызовите run() для каждого имени журнала по порядку. В поле ответа — наибольшее значение счётчика в файле после всех запусков. Приложите файл программы .py; в поле ответа — число.
Строки, которые начинаются с#, — пояснения к данным: в файлы их не копируйте.Принято, если:
1. введённое число совпадает с эталоном;
2. приложен файл .py, который это число выдаёт на данных из условия;Самопроверка перед сдачей (преподаватель смотрит на занятии):
3. первый запуск без файла не падает;
4. файл читается глазами — русские буквы и отступы.# settings.json до первого запуска
{
"тема": "тёмная",
"запусков": {
"anna": 14,
"boris": 7,
"vera": 13,
"gleb": 1,
"dina": 10,
"egor": 13,
"zhanna": 3,
"ilya": 5,
"kira": 8
}
}
# журнал запусков (55 записей, по порядку)
lev, dina, zhanna, gleb, vera, mila, vera, lev, mila, vera, vera, mila, kira, dina, dina, lev, boris, gleb, gleb, kira, lev, nikita, lev, anna, zhanna, gleb, nikita, dina, mila, lev, ilya, dina, anna, vera, nikita, nikita, zhanna, mila, vera, lev, nikita, nikita, mila, kira, vera, nikita, ilya, nikita, egor, nikita, mila, nikita, vera, dina, ilya
Подсказка: Цикл for user in журнал: run(user). В конце откройте settings.json и возьмите max(…) по значениям словаря «запусков» (метод values()).
✅ Готово, если: ответ раскрывает то, что просит критерий приёмки в задании выше.
Онлайн-проверка ответа появится позже
Что дальше
Теперь вы умеете читать и писать CSV так, чтобы Excel понимал файл с первого раза, считать по таблице суммы через DictReader и хранить настройки программы в JSON. В следующей теме спустимся на уровень ниже текста — к байтам: разберём, как устроены картинки и как по первым байтам узнать тип файла.
← Назад · ↑ В начало урока · ⌂ К навигатору курса · Вперёд →

