Это вдохновлено «Как сделать правильное имя файла Windows из произвольной строки?» , я написал функцию, которая будет принимать произвольную строку и делать ее действительным именем файла.
Технически моя функция должна быть ответом на этот вопрос, но я хочу убедиться, что я не сделал ничего глупого или что-то упустил, прежде чем публиковать его как ответ.
Я написал это как часть tvnamer - утилиты, которая берет имена телевизионных эпизодов и переименовывает их красиво и последовательно, с эпизодом, извлеченным из http://www.thetvdb.com - в то время как имя файла источника правильный файл, имя серии исправлено, и имя эпизода - так, чтобы оба могли теоретически содержать любые символы. Я не столько беспокоюсь о безопасности, сколько об удобстве и простоте использования - я в основном предотвращаю переименование файлов .some.series - [01x01].avi
и «исчезновение» файлов (а не предотвращение злых людей)
Он делает несколько предположений:
- Файловая система поддерживает имена файлов Unicode. Как HFS +, так и NTFS, что охватит большинство пользователей. Существует также аргумент
normalize_unicode
для удаления символов Unicode (в tvnamer это устанавливается через XML-файл конфигурации)
- Платформой является либо Darwin, Linux, а все остальное рассматривается как Windows
- Имя файла должно быть видимым (не точечный файл, такой как
.bashrc
) - было бы достаточно просто изменить код, чтобы разрешить .abc
форматировать имена файлов, при желании
Вещи, которые я (надеюсь) обработал:
- Подчеркивание подчеркивания, если имя файла начинается с
.
(предотвращает исчезновение имен файлов .
..
) *
- Удаление разделителей каталогов:
/
в Linux и /
и :
в OS X
- Удаление недопустимых символов имени файла Windows
\/:*?"<>|
(в Windows или принудительно с windows_safe=True
)
- Заранее зарезервированные имена файлов с подчеркиванием (
COM2
становится _COM2
, NUL
становится _NUL
и т. Д.)
- Необязательная нормализация данных Unicode, поэтому
å
становится a
и неконвертируемые символы удаляются
- Усечение имен файлов более 255 символов в Linux / Darwin и 32 символов в Windows
Код и набор тестовых случаев можно найти и поиграть с http://gist.github.com/256270. Код "производства" можно найти в tvnamer / utils.py
Есть ли ошибки в этой функции? Какие условия я пропустил?