Migrating from pathvalidate

disarm's sanitize_filename() replaces pathvalidate for filename sanitization use cases.

Quick migration

# Before
from pathvalidate import sanitize_filename

# After
from disarm import sanitize_filename

API comparison

pathvalidate disarm Notes
sanitize_filename(s) sanitize_filename(s) Same function name
sanitize_filepath(s) Not available disarm handles filenames only
validate_filename(s) Not available disarm sanitizes rather than validates
validate_filepath(s) Not available
is_valid_filename(s) Not available

Parameter mapping

from disarm import sanitize_filename

# pathvalidate — these work directly in disarm (compatibility aliases)
assert sanitize_filename("my<file>.txt", replacement_text="_") == 'my_file.txt'
assert sanitize_filename("my<file>.txt", max_len=100) == 'my_file.txt'

# disarm native names
assert sanitize_filename("my<file>.txt", separator="_") == 'my_file.txt'
assert sanitize_filename("my<file>.txt", max_length=100) == 'my_file.txt'

# platform values are lowercase in disarm
assert sanitize_filename("my<file>.txt", platform="windows") == 'my_file.txt'
pathvalidate parameter disarm parameter Notes
replacement_text separator Both accepted — replacement_text maps to separator
platform platform Values are lowercase in disarm
max_len max_length Both accepted — max_len maps to max_length
lang New: language-aware transliteration
preserve_extension New: protect file extension during truncation

New features in disarm

Unicode transliteration

pathvalidate strips or replaces non-ASCII characters. disarm transliterates them:

# pathvalidate
from pathvalidate import sanitize_filename
sanitize_filename("café résumé.pdf")  # "caf rsm.pdf" (stripped)

# disarm
from disarm import sanitize_filename
sanitize_filename("café résumé.pdf")  # "cafe_resume.pdf" (transliterated)

Language-aware filenames

from disarm import sanitize_filename

assert sanitize_filename("Ärger.txt", lang="de") == 'Aerger.txt'
assert sanitize_filename("Ärger.txt") == 'Arger.txt'

Extension preservation

from disarm import sanitize_filename

assert sanitize_filename("very_long_name.pdf", max_length=15, preserve_extension=True) == 'very_long_n.pdf'

What's not covered

disarm focuses on filename sanitization. pathvalidate also provides:

  • File path sanitization (sanitize_filepath) — disarm handles filenames only, not full paths
  • Validation (validate_filename, is_valid_filename) — disarm sanitizes rather than validates

If you need path sanitization or validation, you may need to keep pathvalidate for those specific functions.