Модуль 33

Робота з файлами та зображеннями

Ось готовий урок, згенерований за твоїм майстер-промптом. Я обрав мову програмування Python, оскільки це стандарт для курсу CS50 і найкращий інструмент для початківців у роботі з даними та зображеннями.


🎓 УРОК CS50: Робота з файлами та зображеннями

(Зберігаємо моменти та малюємо кодом)

Привіт, світе! 👋 Мене звати (Твоє Ім'я), і сьогодні ми перестанемо писати код, який "забуває" все, що сталося, як тільки ви натискаєте кнопку "Stop".

Ми зануримося у файлову систему та магію цифрових зображень.


1. 🔥 Вступ: проблема та мотивація

Уявіть ситуацію. Ви пишете гру. Ваш користувач провів 5 годин, б'ючись із босом, набрав 1,000,000 очок, переміг... і вимкнув комп'ютер.

Наступного дня він запускає гру, а там... 0 очок. Починай спочатку. Як думаєте, що цей користувач зробить з вашою грою? Правильно, видалить її та напише гнівний відгук.

Чому так сталось? Досі всі змінні, які ми створювали, жили в оперативній пам'яті (RAM). Уявіть, що RAM — це робочий стіл. Поки ви сидите за ним (програма працює), ви бачите документи. Але як тільки ви йдете додому (вимикаєте програму) — прибиральниця змітає все в смітник. Стіл стає чистим.

Нам потрібна шафа з архівом (Жорсткий диск / SSD), куди прибиральниця не має доступу. Нам потрібно навчитися зберігати стан.

А зображення? Чому Instagram коштує мільярди? Бо люди люблять очима. Якщо ви вмієте програмно обробляти фото (фільтри, ресайз, розпізнавання облич) — ви володієте суперсилою.

Тож сьогодні ми навчимося двом речам: 1. Зберігати дані на віки. 2. Керувати пікселями.


2. 🧠 Теоретична база (Що там «під капотом»?)

Файли: Потік байтів

Файл для комп'ютера — це не папка з документами. Це просто довга "ковбаса" з байтів (нулів і одиниць), яка лежить на диску.

Коли ви відкриваєте файл у коді, відбувається ось що: 1. Запит: Ви кажете операційній системі (ОС): "Гей, Windows/Linux, дай мені доступ до data.txt". 2. Хендл (Handle): ОС перевіряє права і дає вам спеціальний "ключ" (file handle). 3. Курсор: Уяви, що ти читаєш книгу пальцем. Ти завжди знаходишся в конкретному місці. Коли читаєш — палець (курсор) рухається вперед.

⚠️ Головне правило: Якщо відкрив файл — закрий його! Якщо не закрити, ОС думатиме, що файл зайнятий, і не дасть іншим програмам (або навіть вам самим) його редагувати. Це як взяти книгу в бібліотеці й не повернути.

Зображення: Матриця чисел

Ви бачите фото котика 🐈. Комп'ютер бачить велетенську таблицю Excel.

Кожна клітинка цієї таблиці — це піксель. Кожен піксель складається з трьох лампочок: * 🔴 Red (Червоний) * 🟢 Green (Зелений) * 🔵 Blue (Синій)

Значення кожної "лампочки" — від 0 (вимкнено) до 255 (світить на повну). * (255, 0, 0) — яскраво-червоний. * (0, 0, 0) — чорний (темрява). * (255, 255, 255) — білий (світять усі).

Змінюючи ці цифри, ми змінюємо зображення. Все просто!


3. 🧪 Приклади (Кодимо!)

Приклад 1: Простий запис у файл (Текстовий режим)

Як це робили раніше (небезпечно):

file = open("notes.txt", "w") # "w" означає write (запис)
file.write("Hello, CS50!")
# Якщо тут виникне помилка, наступний рядок не виконається...
file.close() # ...і файл залишиться "підвішеним"

Як це роблять профі (Context Manager): Ми використовуємо магічне слово with. Воно гарантує, що файл закриється сам, навіть якщо програма впаде з помилкою.

# Безпечний спосіб
with open("score.txt", "w") as file:
    file.write("Player1: 1000")

Питання до вас: Якщо я запущу цей код двічі, у файлі буде два рядки чи один? (Пауза...) Відповідь: Один! Режим "w" (write) стирає старий вміст і пише новий. Якщо хочете додати — використовуйте "a" (append).

Приклад 2: Читання файлу

with open("score.txt", "r") as file: # "r" - read
    content = file.read()
    print(f"Зчитано з диску: {content}")

Приклад 3: Робота із зображенням (Бібліотека Pillow)

Давайте візьмемо зображення і зробимо його чорно-білим. Для цього нам потрібна бібліотека Pillow (у CS50 ми часто використовуємо готові інструменти, щоб не винаходити велосипед).

from PIL import Image

# Відкриваємо картинку
img = Image.open("cat.jpg")

# Питання: Що ми побачимо, якщо виведемо size?
print(img.size) # Наприклад: (1920, 1080)

# Конвертуємо в чорно-біле (Grayscale - "L")
bw_img = img.convert("L")

# Зберігаємо результат
bw_img.save("cat_noir.jpg")

Логіка: Ми не змінювали кожен піксель вручну (хоча могли б), ми використали метод .convert(), який сам порахував середнє значення яскравості для кожного пікселя.


4. 🛠 Практична частина

Час розім'яти пальці! Виконайте ці завдання:

  1. 🔹 Щоденник: Напиши програму, яка запитує у користувача "Як пройшов твій день?" і дописує (не перезаписує!) відповідь у файл diary.txt з нового рядка.
  2. 🔹 Аналізатор: Створи файл numbers.txt і запиши туди стовпчик чисел. Напиши скрипт, який читає цей файл, рахує суму чисел і виводить її на екран.
  3. 🔹 Instagram-фільтр:
    • Візьми будь-яке фото.
    • Використай PIL, щоб завантажити його.
    • Розмий його (Blur) або поверни на 180 градусів.
    • Збережи як processed.jpg.
  4. 🔹 Міні-кейс "Секретний агент": Є два файли. В одному список імен, в іншому — список зарплат. Твоє завдання: зчитати обидва і створити третій файл report.txt у форматі: Ім'я: Зарплата.

5. 💡 Мислення як у розробника

Як відрізнити новачка від сеньйора в цій темі?

  1. Шляхи до файлів (Paths):

    • Новачок: Пише C:\Users\Admin\Desktop\file.txt. Це працюватиме тільки на його комп'ютері. На сервері (Linux) чи у друга (Mac) — все зламається.
    • Розробник: Використовує відносні шляхи (./data/file.txt) або бібліотеку os.path / pathlib.
  2. Великі дані:

    • Новачок: Читає весь файл у пам'ять (file.read()). А якщо файл важить 50 ГБ? RAM переповниться, комп'ютер зависне.
    • Розробник: Читає файл рядками (line by line) або шматками (chunks).
  3. Кодування (Encoding):

    • Якщо ви працюєте з українською мовою, завжди явно вказуйте encoding='utf-8'. Інакше замість "Привіт" отримаєте "Ïðèâ³ò". python open("text.txt", "r", encoding="utf-8")

6. 🧩 Підсумок

Отже, що ми маємо? Ми навчилися виходити за межі оперативної пам'яті. Тепер ваші програми мають пам'ять. Вони можуть зберігати налаштування ігор, обробляти звіти бухгалтерії та накладати фільтри на фотографії.

Ви вмієте: * ✅ Читати й писати текстові файли. * ✅ Розуміти різницю між режимами w, r, a. * ✅ Використовувати with, щоб не ламати файлову систему. * ✅ Маніпулювати зображеннями через код.

Що далі? Файли — це чудово для простих задач. Але що, якщо у нас мільйон користувачів, і нам треба знайти одного з них за 0.01 секунди? Текстовий файл тут не впорається — він надто повільний. Наступного разу ми поговоримо про Бази Даних (SQL) — це як Excel, тільки на стероїдах! 🚀

А поки що — відкрийте свій IDE і спробуйте зберегти цей урок у файл. Успіхів!