본문 바로가기
Python/Python FAQ

Python 문자열을 유효한 파일 이름으로 변환하십시오., Turn a string into a valid filename?

by 베타코드 2023. 12. 5.
반응형

질문


나는 파일 이름으로 사용하려는 문자열이 있으므로, Python을 사용하여 파일 이름으로 허용되지 않는 모든 문자를 제거하고 싶습니다.

나는 엄격하게 유지하고 싶습니다. 따라서 문자, 숫자 및 "_-.() "와 같은 일부 다른 문자만 유지하려고 합니다. 가장 우아한 솔루션은 무엇인가요?

파일 이름은 여러 운영 체제 (Windows, Linux 및 Mac OS)에서 유효해야 합니다. 이것은 내 라이브러리의 MP3 파일이며, 노래 제목이 파일 이름으로 사용되며, 3 대의 컴퓨터 간에 공유되고 백업됩니다.


답변


아래의 HTML을 한국어로 번역하되, HTML 태그와 영어로 된 태그 내용은 유지하세요.

임의의 텍스트로부터 "slug"을 생성하는 방법을 알아보려면 Django 프레임워크를 확인할 수 있습니다. (그러나 그들의 라이선스를 고려하세요!) 슬러그는 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
    'allow_unicode'가 False이면 ASCII로 변환합니다. 공백이나 반복된 대시를 단일 대시로 변환합니다.
    알파벳, 밑줄 또는 하이픈이 아닌 문자를 제거합니다. 소문자로 변환합니다. 또한 선행 및 후행 공백, 대시 및 밑줄을 제거합니다.
    """
    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):
    """
    문자열을 정규화하고 소문자로 변환하며, 알파벳이 아닌 문자를 제거하고 공백을 하이픈으로 변환합니다.
    """
    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

더 있지만, 슬러그화에 대한 것이 아니라 이스케이프에 대한 것이므로 제외했습니다.

반응형

댓글