Rozdział 23 · Część IV · Wdrażamy SafeSort
Zdefiniuj kategorię pliku
Klasyfikacja z definicji jest praktyczną heurystyką, a nie dowodem na to, co naprawdę znajduje się w pliku.
SafeSort · Część 4 z 6Wdrożenie
Add file classification
Area: FilesystemPriority: High
git switch -c feat/classifier
Każdemu znalezionemu plikowi trzeba przypisać kategorię — dokumenty, obrazy, wideo i tak dalej. SafeSort określa kategorię według rozszerzenia pliku: prosta i przewidywalna zasada, która obejmuje większość praktycznych przypadków.
| Plik | Kategoria |
|---|---|
| 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
Klasyfikacja w rozszerzeniu jest heurystyką, a nie dowodem treści
Rozbudowa
.pdf oznacza tylko, że nazwa pliku kończy się na .pdf nic nie stoi na przeszkodzie, by zmienić nazwę dowolnego pliku tak, by jego rozszerzenie nie pasowało do rzeczywistego formatu. SafeSort celowo nie zagląda do środka pliku: byłoby wolniejsze, mniej przewidywalne i wykraczałoby poza zadanie „sortowania plików według tego, czym się nazywają”plik o rozszerzeniu, który nie należy do żadnej kategorii, należy do
"other" — w ten sposób klasyfikacja pozostaje kompletna: dowolny plik
Zawsze istnieje jakaś kategoria, nawet jeśli jest najszersza.
Praktyka: classify() i kategorie niestandardowe
Interaktywny Laptop w przeglądarce: Python 3.14 przez Pyodide, bez instalacji
Checkpoint · Issue #2
git commit -m "feat: add file classification"
Zlał się jak Pull Request #16 z osobnej, niezależnej gałęzi, która nie jest powiązana z innymi Issues.
Status prawdziwego Project: Done