Глава 23 · Часть IV · Реализуем SafeSort
Определяем категорию файла
Классификация по расширению — практичная эвристика, не доказательство того, что действительно лежит внутри файла.
SafeSort · Часть 4 из 6Реализация
Add file classification
Area: FilesystemPriority: High
git switch -c feat/classifier
Каждому найденному файлу нужно назначить категорию — документы, изображения, видео и так далее. SafeSort определяет категорию по расширению файла: простое и предсказуемое правило, которое покрывает подавляющее большинство практических случаев.
| Файл | Категория |
|---|---|
| report.pdf | documents |
| photo.jpg | images |
| backup.zip | archives |
| unknown.xyz | other |
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