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

新手上路,请多包涵

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

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

文件名需要在多个操作系统(Windows、Linux 和 Mac OS)上有效 - 它是我库中的一个 MP3 文件,以歌曲标题作为文件名,并在 3 台机器之间共享和备份。

原文由 Sophie Gage 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 668
2 个回答

您可以查看 Django 框架,了解它们如何从任意文本创建“slug”。 slug 是 URL 和文件名友好的。

Django 文本实用程序定义了一个函数 slugify() ,这可能是这类事情的黄金标准。本质上,他们的代码如下。

 import unicodedata
import re

def slugify(value, allow_unicode=False):
    """
    Taken from https://github.com/django/django/blob/master/django/utils/text.py
    Convert to ASCII if 'allow_unicode' is False. Convert spaces or repeated
    dashes to single dashes. Remove characters that aren't alphanumerics,
    underscores, or hyphens. Convert to lowercase. Also strip leading and
    trailing whitespace, dashes, and underscores.
    """
    value = str(value)
    if allow_unicode:
        value = unicodedata.normalize('NFKC', value)
    else:
        value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii')
    value = re.sub(r'[^\w\s-]', '', value.lower())
    return re.sub(r'[-\s]+', '-', value).strip('-_')

和旧版本:

 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))
    # ...
    return value

还有更多,但我把它漏掉了,因为它不解决 slugification,而是逃避。

原文由 S.Lott 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以将列表理解与字符串方法一起使用。

 >>> s
'foo-bar#baz?qux@127/\\9]'
>>> "".join(x for x in s if x.isalnum())
'foobarbazqux1279'

原文由 lutz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题