将字符串转换为有效的文件名?

我有一个要用作文件名的字符串,因此我想使用Python删除文件名中不允许的所有字符。


我宁愿严格一点,所以假设我只保留字母,数字和一小部分其他字符,例如"_-.() "。什么是最优雅的解决方案?


文件名在多个操作系统(Windows,Linux和Mac OS)上必须有效-这是我库中的MP3文件,歌曲名作为文件名,并且在3台计算机之间共享和备份。


白猪掌柜的
浏览 982回答 3
3回答

摇曳的蔷薇

您可以查看Django框架,了解它们如何从任意文本创建“子弹”。slug是URL和文件名友好的。Django文本工具定义了一个函数,slugify()这可能是此类事情的黄金标准。本质上,它们的代码如下。def slugify(value):    """    Normalizes string, converts to lowercase, removes non-alpha characters,    and converts spaces to hyphens.    """    import unicodedata    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())    value = unicode(re.sub('[-\s]+', '-', value))还有更多,但我不予赘述,因为它不解决节段化,而是逃脱。

BIG阳

只是为了使事情更加复杂,不能保证仅通过删除无效字符就可以获得有效的文件名。由于不同文件名上允许的字符不同,因此保守的方法可能最终将有效名称变成无效名称。在以下情况下,您可能需要添加特殊处理:该字符串是所有无效字符(留空字符串)您最终得到一个具有特殊含义的字符串,例如“。”。要么 ”..”在Windows上,某些设备名称被保留。例如,您无法创建名为“ nul”,“ nul.txt”(或实际上是nul.anything)的文件。保留名称为:CON,PRN,AUX,NUL,COM1,COM2,COM3,COM4,COM5,COM6,COM7,COM8,COM9,LPT1,LPT2,LPT3,LPT4,LPT5,LPT6,LPT7,LPT8和LPT9您可以通过在文件名前添加一些字符串来解决这些问题,这些文件名永远不会导致这些情况之一,并去除无效字符。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python