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

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

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

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


你可以看看Django框架是如何从任意文本中创建“slug”的。 一个slug是URL和文件名友好的。

他们的template/defaultfilters.py (在第183行左右)定义了一个函数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('[^ws-]', '', value).strip().lower())
    value = unicode(re.sub('[-s]+', '-', value))

还有更多,但我把它排除在外,因为它没有解决slu,,而是逃避。


这种白名单方法(即,只允许valid_chars中存在的字符)将在文件的格式或非法的有效字符组合(如“..”)的格式不受限制时起作用,例如,您所说的将允许一个名为“.txt”的文件名,我认为这在Windows上是无效的。 由于这是最简单的方法,我会尝试从valid_chars中删除空格,并在出现错误时预先设置一个已知的有效字符串,其他任何方法都必须知道允许在哪里处理Windows文件命名限制,从而可以更复杂得多。

>>> import string
>>> valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
>>> valid_chars
'-_.() abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
>>> filename = "This Is a (valid) - filename%$&$ .txt"
>>> ''.join(c for c in filename if c in valid_chars)
'This Is a (valid) - filename .txt'

什么是使用字符串作为文件名的原因? 如果人的可读性不是一个因素,我会使用base64模块来生成文件系统安全字符串。 它不可读,但你不必处理碰撞,它是可逆的。

import base64
file_name_string = base64.urlsafe_b64encode(your_string)

更新 :根据马修评论改变。

链接地址: http://www.djcxy.com/p/9793.html

上一篇: Turn a string into a valid filename?

下一篇: Uses for this bash filename extraction technique?