为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哆啦的时光机 2019-12-06 14:06:28
我有一个要用作文件名的字符串,因此我想使用Python删除文件名中不允许的所有字符。我宁愿严格一点,所以假设我只保留字母,数字和一小部分其他字符,例如"_-.() "。什么是最优雅的解决方案?文件名在多个操作系统(Windows,Linux和Mac OS)上必须有效-这是我库中的MP3文件,歌曲名作为文件名,并且在3台计算机之间共享和备份。
查看完整描述

3 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您可以查看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))

还有更多,但我不予赘述,因为它不解决节段化,而是逃脱。



查看完整回答
反对 回复 2019-12-07
?
智慧大石

TA贡献1946条经验 获得超3个赞

只是为了使事情更加复杂,不能保证仅通过删除无效字符就可以获得有效的文件名。由于不同文件名上允许的字符不同,因此保守的方法可能最终将有效名称变成无效名称。在以下情况下,您可能需要添加特殊处理:

  • 该字符串是所有无效字符(留空字符串)

  • 您最终得到一个具有特殊含义的字符串,例如“。”。要么 ”..”

  • 在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

您可以通过在文件名前添加一些字符串来解决这些问题,这些文件名永远不会导致这些情况之一,并去除无效字符。



查看完整回答
反对 回复 2019-12-07
  • 3 回答
  • 0 关注
  • 346 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信