UPDATE
Все ссылки неработоспособны в этом 6-летнем ответе.
Кроме того, я бы больше так не делал, просто base64
кодировал или отбрасывал небезопасные символы. Пример Python 3:
import re
t = re.compile("[a-zA-Z0-9.,_-]")
unsafe = "abc∂éåß®∆˚˙©¬ñ√ƒµ©∆∫ø"
safe = [ch for ch in unsafe if t.match(ch)]
# => 'abc'
С помощью base64
вы можете кодировать и декодировать, чтобы вы могли снова получить исходное имя файла.
Но в зависимости от варианта использования вам может быть лучше создать случайное имя файла и сохранить метаданные в отдельном файле или БД.
from random import choice
from string import ascii_lowercase, ascii_uppercase, digits
allowed_chr = ascii_lowercase + ascii_uppercase + digits
safe = ''.join([choice(allowed_chr) for _ in range(16)])
# => 'CYQ4JDKE9JfcRzAZ'
ОРИГИНАЛЬНЫЙ LINKROTTEN ОТВЕТ :
Проект bobcat
содержит модуль python, который делает именно это.
Это не совсем надежно, см. сообщение и ответ .
Итак, как уже отмечалось: base64
кодирование, вероятно, является лучшей идеей, если читаемость не имеет значения.