1. ホーム
  2. python

[解決済み] 文字列を有効なファイル名に変換しますか?

2022-03-14 23:45:29

質問

ファイル名として使用したい文字列があるので、Pythonを使ってファイル名として許されない文字をすべて削除したいのですが、どうすればいいですか?

私はどちらかというと厳格にしたいので、例えば、文字と数字とその他の小さな文字セットだけを残して "_-.() " . 最もエレガントな解決策は何でしょうか?

ファイル名は複数のOS(Windows、Linux、Mac OS)で有効である必要があります。私のライブラリにあるMP3ファイルで、曲名がファイル名になっており、3台のマシンで共有しバックアップしています。

解決方法は?

を見ることができます。 Django フレームワーク は、任意のテキストからどのように"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

他にもありますが、スラッグ化ではなく、エスケープに対応しているので割愛しました。