22. (П10) Робота з файлами: збереження і аналіз даних¶
Мета роботи¶
Навчитися будувати шляхи незалежно від місця запуску програми, створювати каталоги й файли, зберігати дані між запусками, розбирати текстовий файл на структуровані записи, формувати звіт з вирівняними колонками та працювати з файлами у двійковому режимі.
Персоналізація обовʼязкова
Кожне завдання має працювати з вашими справжніми даними: іменем, групою, вашими витратами за минулий тиждень, вашим каталогом на диску. Роботи з вигаданими test.txt, aaa;bbb;111 або з даними іншого студента не приймаються.
Підготовка¶
Створіть каталог lab22 — це корінь вашого проєкту. Кожне завдання виконуйте в окремому файлі всередині нього: task1.py … task4.py. Теоретичний матеріал — лекція 21.
Ваші персональні дані¶
| Позначення | Звідки береться | Приклад | Завдання |
|---|---|---|---|
name |
ваше імʼя латиницею | Ivan |
усі |
surname |
ваше прізвище латиницею | Petrenko |
усі |
group |
ваша група | PZ-11 |
усі |
year |
рік вашого народження | 2007 |
1 |
language |
ваша улюблена мова програмування | Python |
1 |
| витрати | ваші реальні витрати за останні 7 днів, щонайменше 12 записів: дата, категорія латиницею, сума, короткий опис | 2026-09-21;food;85.50;lunch |
3 |
| каталог | реальний каталог на вашому компʼютері, у якому щонайменше 10 файлів (наприклад, каталог з навчальними матеріалами) | ~/Downloads |
4 |
Хід роботи¶
Завдання 1. Робоче місце програми¶
Файл task1.py. Програма готує структуру проєкту і доводить, що вміє знаходити свої файли з будь-якого місця запуску.
- Виведіть чотири шляхи з підписами: поточний робочий каталог, абсолютний шлях до файлу самої програми, каталог скрипта, домашній каталог.
- Створіть усередині каталогу скрипта три каталоги:
data,reports,backups. Повторний запуск програми не повинен викликати помилку. - Запишіть у
data/profile.txtпʼять рядків у форматіkey: valueзі своїми даними:name,surname,group,year,language. - Для цього файлу виведіть: абсолютний шлях, шлях відносно каталогу скрипта (
relative_to),name,stem,suffix, імʼя батьківського каталогу та розмір у байтах. - Виведіть дерево проєкту: кожен каталог із відступом і список файлів у ньому.
Приклад роботи програми:
cwd: /home/student/projects/lab22
script: /home/student/projects/lab22/task1.py
script dir: /home/student/projects/lab22
home: /home/student
profile path: /home/student/projects/lab22/data/profile.txt
relative: data/profile.txt
name: profile.txt
stem: profile
suffix: .txt
parent: data
size: 70 bytes
project tree:
backups/
data/
profile.txt
reports/
Завдання 2. Памʼять між запусками¶
Файл task2.py. Програма памʼятає, скільки разів її запускали.
Програма складається лише з функцій і одного виклику main() наприкінці файлу.
- Напишіть функцію
count_runs(path), яка повертає кількість непорожніх рядків у файліdata/runs.log, а якщо файлу ще немає —0. -
Напишіть функцію
add_run(path, number), яка дописує в кінець того самого файлуdata/runs.logодин рядокномер;дата і час;ваше імʼя, нічого не стираючи.Час беріть так: -
Напишіть функцію
show_history(path, last=3), яка виводить загальну кількість запусків, три останні записи у вигляді таблиці та час найпершого запуску. - У
main(): обчисліть номер поточного запуску, додайте запис, привітайтеся на імʼя і покажіть історію. При першому запуску додатково повідомте, що файл щойно створено. - Запустіть програму щонайменше пʼять разів. У звіт вставте вивід першого, другого і пʼятого запуску, а також вміст файлу
data/runs.logпісля них.
Приклад третього запуску:
Hello, Ivan Petrenko! This is run number 3.
runs so far: 3
last runs:
# 1 2026-09-21 09:14:02 Ivan Petrenko
# 2 2026-09-21 09:15:37 Ivan Petrenko
# 3 2026-09-23 18:02:11 Ivan Petrenko
first run was at 2026-09-21 09:14:02
Завдання 3. Трекер витрат¶
Файл task3.py. Головне завдання роботи: справжня маленька програма, яка зберігає ваші витрати у файлі та будує з них звіт.
Дані беріть свої реальні — за останні сім днів, щонайменше 12 записів. Якщо точних сум не памʼятаєте, відновіть їх приблизно, але правдоподібно.
Формат файлу data/expenses.csv — по одному запису в рядку, поля через ;:
# date;category;amount;note
2026-09-21;food;85.50;lunch at canteen
2026-09-21;transport;32.00;bus to college
2026-09-22;coffee;65.00;before the lecture
Витрати програма отримує з командного рядка — вона працює як маленька консольна утиліта з трьома командами (лекція 21, розділ «Аргументи командного рядка»):
$ python3 task3.py add 2026-09-21 food 85.50 lunch at canteen
$ python3 task3.py list
$ python3 task3.py report
Що має вміти готова програма:
add <date> <category> <amount> <note>— дописує одну витрату в кінецьdata/expenses.csv, не перечитуючи і не переписуючи файл. Каталогdataі рядок-заголовок# date;category;amount;noteпрограма створює сама при першому запуску. Опис витрати може складатися з кількох слів — зберіть його з усіх аргументів, що лишилися після суми.list— читає файл і показує всі витрати таблицею з вирівняними колонками, а наприкінці — кількість записів і загальну суму.-
report— будує звіт, записує його уreports/expenses_report.txtі показує на екрані. Звіт містить:- шапку з вашим імʼям, групою, періодом (перша і остання дата) та кількістю записів;
- таблицю по категоріях, відсортовану за сумою за спаданням: назва, кількість покупок, сума, частка у відсотках і «гістограма» із символів
#(один символ на кожні 5 %); - підсумковий рядок;
- день з найбільшими витратами, найдорожчу покупку та середні витрати на день.
-
Підказка замість помилки. Якщо аргументів немає, команда невідома або для
addїх замало — програма виводитьusageз переліком команд і завершується, а не падає зIndexError. - Не ламатися на «брудному» файлі. Читання має пропускати порожні рядки і рядки, що починаються з
#.
Порядок виконання:
- Наповніть файл своїми витратами, викликавши команду
addщонайменше 12 разів. У звіт вставте кілька таких викликів і отриманий вмістdata/expenses.csv. - Покажіть вивід команд
listіreport.
Приклади запуску.
Без аргументів програма показує підказку, а add дописує один запис:
$ python3 task3.py
usage: python3 task3.py add <date> <category> <amount> <note>
python3 task3.py list
python3 task3.py report
$ python3 task3.py add 2026-09-21 food 85.50 lunch at canteen
added: 2026-09-21 food 85.50 (lunch at canteen)
$ python3 task3.py add 2026-09-23 books 220.00 python handbook
added: 2026-09-23 books 220.00 (python handbook)
Команда list показує все, що вже накопичилося у файлі:
$ python3 task3.py list
date category amount note
2026-09-21 food 85.50 lunch at canteen
2026-09-21 transport 32.00 bus to college
2026-09-22 food 120.00 groceries
2026-09-22 coffee 65.00 before the lecture
2026-09-23 books 220.00 python handbook
2026-09-23 food 45.00 snack
2026-09-24 transport 32.00 bus to college
2026-09-24 food 96.50 dinner with friends
2026-09-25 coffee 65.00 before the lecture
2026-09-25 internet 250.00 monthly plan
2026-09-26 transport 32.00 bus to college
2026-09-26 food 65.00 pizza slice
2026-09-27 food 140.00 weekend market
13 records, total 1248.00
Команда report рахує підсумки, показує звіт на екрані й зберігає його у файл:
$ python3 task3.py report
Expenses report for Ivan Petrenko (PZ-11)
Period: 2026-09-21 .. 2026-09-27
Records: 13
category count total share chart
----------------------------------------------------
food 6 552.00 44.2% #########
internet 1 250.00 20.0% ####
books 1 220.00 17.6% ####
coffee 2 130.00 10.4% ##
transport 3 96.00 7.7% ##
----------------------------------------------------
total 13 1248.00 100.0%
Top day: 2026-09-25 (315.00)
Most expensive: internet 250.00 (monthly plan)
Average per day: 178.29
report saved to: reports/expenses_report.txt
Помилкові виклики не повинні завершувати програму аварійно:
$ python3 task3.py add 2026-09-21 food
error: add needs date, category, amount and note
usage: python3 task3.py add <date> <category> <amount> <note>
python3 task3.py list
python3 task3.py report
$ python3 task3.py summary
error: unknown command summary
usage: python3 task3.py add <date> <category> <amount> <note>
python3 task3.py list
python3 task3.py report
Знайшли помилку чи бажаєте додати інформацію, щоб покращити курс? Створіть issue на GitHub