Исходный код storage
import os
import csv
import datetime
import pandas as pd
from models import Transaction
# Пути к файлам с данными
_base_dir = os.path.dirname(os.path.abspath(__file__))
DATA_DIR = os.path.join(_base_dir, 'data')
CSV_FILE = os.path.join(DATA_DIR, f'transactions.csv')
[документация]
def ensure_data_dir():
"""Проверяет наличие директории для хранения данных и создает её при отсутствии.
Функция использует путь, указанный в глобальной переменной `DATA_DIR`.
Если целевая папка (и все промежуточные директории) отсутствует в файловой
системе, она будет создана автоматически.
Note:
Функция опирается на внешнюю константу `DATA_DIR`, которая должна быть
определена в модуле.
Raises:
OSError: Если создание директории невозможно из-за ограничений прав
доступа или системных ошибок.
"""
if not os.path.exists(DATA_DIR):
os.makedirs(DATA_DIR)
[документация]
def save_transactions(transactions):
"""Сохраняет список транзакций в CSV-файл.
Функция выполняет дозапись (append) данных в файл.
Если файл не существует, он создается вместе с заголовками столбцов.
При пустом входном списке запись не производится.
Args:
transactions (list[Transaction]): Список объектов транзакций для сохранения.
Каждый объект должен иметь метод `to_dict()`.
Note:
- Использует глобальную константу `CSV_FILE` для определения пути к файлу.
- Автоматически вызывает `ensure_data_dir()` перед началом записи.
- Данные сохраняются в кодировке UTF-8.
Raises:
Exception: Если возникает ошибка при открытии файла или процессе записи
(ошибка перехватывается внутри функции и выводится в консоль).
Example:
>>> tx = Transaction(100.0, "Еда", "2026-01-06", "Хлеб", "expense")
>>> save_transactions([tx])
"""
if not transactions:
return # Ничего не делаем
ensure_data_dir() # Создаем папку
file_exists = os.path.isfile(CSV_FILE)
try:
with open(CSV_FILE, mode='a', newline='', encoding='utf-8') as f:
fieldnames = ['amount', 'category', 'date', 'description', 'transaction_type']
writer = csv.DictWriter(f, fieldnames=fieldnames)
# Если файл новый, записываем заголовки
if not file_exists:
writer.writeheader()
for t in transactions:
writer.writerow(t.to_dict())
except Exception as e:
print(f'Ошибка при сохранении данных: {e}')
[документация]
def load_transactions():
"""Загружает список транзакций из CSV-файла и преобразует их в объекты Transaction.
Функция считывает данные из хранилища, выполняет десериализацию каждой строки
и восстанавливает объекты класса :class:`Transaction`. Если директория данных
или сам файл отсутствуют, возвращается пустой список.
Returns:
list[Transaction]: Список восстановленных объектов транзакций.
В случае отсутствия файла или возникновения ошибки чтения возвращается
пустой список `[]`.
Note:
- Опирается на глобальные константы `DATA_DIR` и `CSV_FILE`.
- Предполагает, что CSV-файл имеет корректные заголовки:
'amount', 'category', 'date', 'description', 'transaction_type'.
Raises:
Exception: Если возникает ошибка при чтении файла или парсинге данных
(например, поврежден формат CSV). Ошибка перехватывается, выводится
в консоль, и функция возвращает пустой список.
"""
transactions = []
if not os.path.exists(DATA_DIR):
return transactions # Возвращаем пустой список, если файла нет
try:
with open(CSV_FILE, mode='r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
# Создаем объект Transaction, преобразуя данные из строк
t = Transaction(
amount=float(row['amount']),
category=row['category'],
date=row['date'],
description=row.get('description', ''),
transaction_type=row['transaction_type']
)
transactions.append(t)
except Exception as e:
print(f'Ошибка при загрузке данных: {e}')
return []
return transactions