Суммировать выручку по дням из лог-файла, не влезающего в память целиком
Лог выручки в path содержит по одному заказу на строку в виде day,order_id,amount (например 2026-07-15,A17,42.50). Файл намного больше оперативной памяти. Верните dict, сопоставляющий каждому дню его суммарную выручку, не загружая файл целиком.
Считайте, что каждая строка корректна.
def revenue_per_day(path: str) -> dict[str, float]:
# ваш код здесь
Напишите реализацию.
Итерируйте файловый объект построчно — Python читает лениво, память остаётся плоской. Разберите день и сумму строки, прибавляя сумму в dict с ключом-днём. Не вызывайте read() или readlines() — они грузят весь файл сразу.
- ✗Вызывать read() или readlines(), загружая весь файл
- ✗Резать по границам байт и рвать строку пополам
- ✗Хвататься за pandas на файле больше памяти
- →Почему итерация файлового объекта держит память плоской?
- →Как обработать битую строку, не упав?
Iterating an open file yields one line at a time, so peak memory is one line plus the result dict — independent of file size. Accumulate with dict.get or a defaultdict.
from collections import defaultdict
def revenue_per_day(path):
totals = defaultdict(float)
with open(path) as f:
for line in f:
day, _order_id, amount = line.rstrip("\n").split(",")
totals[day] += float(amount)
return dict(totals)
The key discipline is never materialising the whole file: for line in f reads lazily, whereas f.read() or f.readlines() would load every byte at once and blow past RAM on a file this large.