Глава 23 · Часть IV · Реализуем SafeSort

Определяем категорию файла

Классификация по расширению — практичная эвристика, не доказательство того, что действительно лежит внутри файла.

SafeSort · Часть 4 из 6Реализация
GitHubIssue #2 · Project «SafeSort — первый релиз»
Add file classification
Area: FilesystemPriority: High
git switch -c feat/classifier

Каждому найденному файлу нужно назначить категорию — документы, изображения, видео и так далее. SafeSort определяет категорию по расширению файла: простое и предсказуемое правило, которое покрывает подавляющее большинство практических случаев.

Файловая системакаталог с файламиСканерscan()Классификаторclassify()
К цепочке присоединяется новое звено — классификатор.
ФайлКатегория
report.pdfdocuments
photo.jpgimages
backup.ziparchives
unknown.xyzother
src/safesort/config.py
DEFAULT_EXTENSIONS: dict[str, list[str]] = {
    "documents": [".pdf", ".docx", ".txt", ".odt"],
    "images": [".jpg", ".jpeg", ".png", ".webp"],
    "video": [".mp4", ".mkv", ".mov"],
    "audio": [".mp3", ".wav", ".flac"],
    "archives": [".zip", ".tar", ".gz", ".7z"],
    "code": [".py", ".js", ".ts", ".rs", ".java"],
    "data": [".json", ".csv", ".xml"],
}
src/safesort/classifier.py
OTHER_CATEGORY = "other"

def classify(extension: str, mapping: dict[str, list[str]]) -> str:
    normalized = extension.lower()
    for category, extensions in mapping.items():
        lowered = {ext.lower() for ext in extensions}
        if normalized in lowered:
            return category
    return OTHER_CATEGORY
Классификация по расширению — эвристика, а не доказательство содержимого
Расширение .pdf означает лишь то, что имя файла заканчивается на .pdf — ничто не мешает переименовать любой файл так, чтобы его расширение не соответствовало реальному формату. SafeSort сознательно не заглядывает внутрь файла: это было бы медленнее, менее предсказуемо и выходит за рамки задачи «разложить файлы по тому, чем они себя называют».

Файл с расширением, которого нет ни в одной категории, попадает в "other" — так классификация остаётся полной: у любого файла всегда есть категория, даже если это самая широкая из них.

Практика: classify() и собственные категории
Интерактивный ноутбук в браузере: Python 3.14 через Pyodide, без установки
Открыть практику →
Чекпойнт · Issue #2
git commit -m "feat: add file classification"
Слился как Pull Request #16 из отдельной самостоятельной ветки, не связанная с остальными Issues.
Статус в реальном Project: Done