它的灵感来自“如何从任意字符串生成有效的 Windows 文件名?” ,我编写了一个函数,它将采用任意字符串并使其成为有效的文件名。
从技术上讲,我的功能应该是对这个问题的回答,但我想确保在将其发布为答案之前,我没有做任何愚蠢的事情或忽略任何事情。
我把它写成tvnamer的一部分- 一个实用程序,它接受电视剧集文件名,并将它们重命名好且一致,从http://www.thetvdb.com提取一集- 而源文件名必须是有效文件,系列名称已更正,剧集名称 - 因此理论上两者都可以包含任何字符。我不太关心安全性而是可用性 - 这主要是为了防止文件被重命名.some.series - [01x01].avi
和文件“消失”(而不是阻止邪恶的人)
它做了几个假设:
- 文件系统支持 Unicode 文件名。HFS+ 和 NTFS 都可以,这将覆盖大多数用户。还有一个
normalize_unicode
参数可以去除 Unicode 字符(在 tvnamer 中,这是通过配置 XML 文件设置的) - 该平台是 Darwin、Linux,其他一切都被视为 Windows
- 文件名应该是可见的(不是像 dotfile 这样的点文件
.bashrc
)——如果需要,可以很简单地修改代码以允许.abc
格式化文件名
我(希望)处理的事情:
- 如果文件名以以下划线开头
.
(防止文件名.
..
和文件消失) - 删除目录分隔符:
/
在 Linux/
和:
OS X 上 - 删除无效的 Windows 文件名字符
\/:*?"<>|
(在 Windows 上时,或强制使用windows_safe=True
) - 在保留文件名前加上下划线(
COM2
变成_COM2
、NUL
变成_NUL
等) - Unicode 数据的可选规范化,因此
å
变为a
和不可转换的字符被删除 - 在 Linux/Darwin 上截断超过 255 个字符的文件名,在 Windows 上截断 32 个字符
代码和一堆测试用例可以在http://gist.github.com/256270找到和修改。“生产”代码可以在 tvnamer/utils.py中找到
这个函数有错误吗?我错过了什么条件?