Skip to content

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. Програма готує структуру проєкту і доводить, що вміє знаходити свої файли з будь-якого місця запуску.

  1. Виведіть чотири шляхи з підписами: поточний робочий каталог, абсолютний шлях до файлу самої програми, каталог скрипта, домашній каталог.
  2. Створіть усередині каталогу скрипта три каталоги: data, reports, backups. Повторний запуск програми не повинен викликати помилку.
  3. Запишіть у data/profile.txt пʼять рядків у форматі key: value зі своїми даними: name, surname, group, year, language.
  4. Для цього файлу виведіть: абсолютний шлях, шлях відносно каталогу скрипта (relative_to), name, stem, suffix, імʼя батьківського каталогу та розмір у байтах.
  5. Виведіть дерево проєкту: кожен каталог із відступом і список файлів у ньому.

Приклад роботи програми:

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() наприкінці файлу.

  1. Напишіть функцію count_runs(path), яка повертає кількість непорожніх рядків у файлі data/runs.log, а якщо файлу ще немає — 0.
  2. Напишіть функцію add_run(path, number), яка дописує в кінець того самого файлу data/runs.log один рядок номер;дата і час;ваше імʼя, нічого не стираючи.Час беріть так:

    from datetime import datetime
    
    stamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
  3. Напишіть функцію show_history(path, last=3), яка виводить загальну кількість запусків, три останні записи у вигляді таблиці та час найпершого запуску.

  4. У main(): обчисліть номер поточного запуску, додайте запис, привітайтеся на імʼя і покажіть історію. При першому запуску додатково повідомте, що файл щойно створено.
  5. Запустіть програму щонайменше пʼять разів. У звіт вставте вивід першого, другого і пʼятого запуску, а також вміст файлу 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

Що має вміти готова програма:

  1. add <date> <category> <amount> <note> — дописує одну витрату в кінець data/expenses.csv, не перечитуючи і не переписуючи файл. Каталог data і рядок-заголовок # date;category;amount;note програма створює сама при першому запуску. Опис витрати може складатися з кількох слів — зберіть його з усіх аргументів, що лишилися після суми.
  2. list — читає файл і показує всі витрати таблицею з вирівняними колонками, а наприкінці — кількість записів і загальну суму.
  3. report — будує звіт, записує його у reports/expenses_report.txt і показує на екрані. Звіт містить:

    • шапку з вашим імʼям, групою, періодом (перша і остання дата) та кількістю записів;
    • таблицю по категоріях, відсортовану за сумою за спаданням: назва, кількість покупок, сума, частка у відсотках і «гістограма» із символів # (один символ на кожні 5 %);
    • підсумковий рядок;
    • день з найбільшими витратами, найдорожчу покупку та середні витрати на день.
  4. Підказка замість помилки. Якщо аргументів немає, команда невідома або для add їх замало — програма виводить usage з переліком команд і завершується, а не падає з IndexError.

  5. Не ламатися на «брудному» файлі. Читання має пропускати порожні рядки і рядки, що починаються з #.

Порядок виконання:

  1. Наповніть файл своїми витратами, викликавши команду add щонайменше 12 разів. У звіт вставте кілька таких викликів і отриманий вміст data/expenses.csv.
  2. Покажіть вивід команд 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