Модуль 8: Практика — скрипти та автоматизація

Робота з JSON та CSV

📖 Теорія
JSON та CSV — найпопулярніші формати даних.

JSON (JavaScript Object Notation):
• Людиночитабельний текстовий формат
• Чудово підходить для налаштувань, відповідей API
• У Python: модуль json
• json.dumps() — об'єкт → рядок JSON
• json.loads() — рядок JSON → об'єкт
• json.dump() — записати у файл
• json.load() — прочитати з файлу

CSV (Comma-Separated Values):
• Таблиці в текстовому форматі
• У Python: модуль csv
• Зручний для експорту/імпорту таблиць
💡 Приклад коду
Вивід:

                        
📝 ЗАВДАННЯ (3)
1.
Завдання 1: База контактів
30 XP
Створіть програму для керування контактами. Контакти зберігаються в contacts.json. Програма повинна: завантажувати контакти при старті, давати додати новий контакт (ім'я + телефон), виводити всі контакти, зберігати при виході.
💡 Підказка: При першому запуску файлу немає — обробіть FileNotFoundError
🔓 Розв'язок:
import json

try:
    with open('contacts.json', 'r', encoding='utf-8') as f:
        contacts = json.load(f)
except FileNotFoundError:
    contacts = {}

print(f'Завантажено {len(contacts)} контактів')
name = input('Ім\'я нового контакту (Enter - пропустити): ')
if name:
    phone = input('Телефон: ')
    contacts[name] = phone

print('\nУсі контакти:')
for n, p in contacts.items():
    print(f'  {n}: {p}')

with open('contacts.json', 'w', encoding='utf-8') as f:
    json.dump(contacts, f, ensure_ascii=False, indent=2)
Вивід:

                                

2.
Завдання 2: CSV-звіт з продажів
40 XP
Створіть CSV-файл sales.csv зі стовпцями: товар, кількість, ціна. Додайте 5 рядків даних. Потім прочитайте файл та виведіть: загальну суму продажів, найдорожчий товар та середній чек.
💡 Підказка: Використовуйте csv.writer для запису та csv.DictReader для читання. Загальна сума = сума (кількість * ціна) по всіх рядках.
🔓 Розв'язок:
import csv

# Записуємо дані
with open('sales.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['товар', 'кількість', 'ціна'])
    writer.writerows([
        ['Ноутбук', 2, 45000],
        ['Мишка', 10, 800],
        ['Клавіатура', 5, 2500],
        ['Монітор', 3, 18000],
        ['Навушники', 8, 3500]
    ])

# Читаємо та аналізуємо
with open('sales.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    total = 0
    max_price = 0
    max_item = ''
    count = 0
    for row in reader:
        summa = int(row['кількість']) * int(row['ціна'])
        total += summa
        count += 1
        if int(row['ціна']) > max_price:
            max_price = int(row['ціна'])
            max_item = row['товар']

print(f'Загальна сума: {total} грн.')
print(f'Найдорожчий: {max_item} ({max_price} грн.)')
print(f'Середній чек: {total / count:.0f} грн.')
Вивід:

                                

3.
Завдання 3: Конвертер JSON ↔ CSV
50 XP
Напишіть програму з двома функціями: json_to_csv(json_file, csv_file) та csv_to_json(csv_file, json_file). Протестуйте: створіть JSON з даними про студентів (ім'я, вік, оцінка), конвертуйте у CSV та назад.
💡 Підказка: Для JSON використовуйте json.load/json.dump. Для CSV — csv.DictWriter (з JSON) та csv.DictReader (у JSON). Ключі JSON стають заголовками CSV.
🔓 Розв'язок:
import json
import csv

def json_to_csv(json_file, csv_file):
    with open(json_file, 'r', encoding='utf-8') as f:
        data = json.load(f)
    with open(csv_file, 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=data[0].keys())
        writer.writeheader()
        writer.writerows(data)
    print(f'{json_file} -> {csv_file}')

def csv_to_json(csv_file, json_file):
    with open(csv_file, 'r', encoding='utf-8') as f:
        data = list(csv.DictReader(f))
    with open(json_file, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    print(f'{csv_file} -> {json_file}')

# Тест
students = [
    {'ім\'я': 'Аня', 'вік': 20, 'оцінка': 95},
    {'ім\'я': 'Борис', 'вік': 22, 'оцінка': 82},
    {'ім\'я': 'Віка', 'вік': 21, 'оцінка': 90}
]
with open('students.json', 'w', encoding='utf-8') as f:
    json.dump(students, f, ensure_ascii=False, indent=2)

json_to_csv('students.json', 'students.csv')
csv_to_json('students.csv', 'students_copy.json')
Вивід: