[파이썬] 파일명 특수문자 이스케이프 함수

이 글은 읽는데 약 4분이 걸립니다.
def escapeName(self, name: str) -> str:
    name = name.strip()  # 앞 뒤 공백 제거

    not_allow = (
            [".", ".."] +  # 현재 폴더, 상위 폴더
            ["CON", "AVX", "NUL", "PRN"] +  # Windows 예약어
            ["con", "avx", "nul", "prn"] +  # Windows 예약어
            ["COM" + str(i) for i in range(0, 10)] +  # Windows 예약어 COM0 ~ COM9
            ["com" + str(i) for i in range(0, 10)] +  # Windows 예약어 COM0 ~ COM9
            ["LPT" + str(i) for i in range(0, 10)] +  # Windows 예약어 com0 ~ com9
            ["lpt" + str(i) for i in range(0, 10)]  # Windows 예약어 lpt0 ~ lpt9
    )
    allow = (
            ["·", "··"] +
            ["CON", "AVX", "NUL", "PRN"] +
            ["con", "avx", "nul", "prn"] +
            ["COM" + str(i) for i in range(0, 10)] +
            ["com" + str(i) for i in range(0, 10)] +
            ["LPT" + str(i) for i in range(0, 10)] +
            ["lpt" + str(i) for i in range(0, 10)]
    )

    for idx, each in enumerate(not_allow):
        if name == each:
            return allow[idx]

    # 파일명 끝이 마침표로 끝나는 경우
    if name.endswith("."):
        name = name[:-1] + "·"

    return (name.replace("\\", "/")  # 백슬러시
            .replace("/", "/")  # 슬러시
            .replace(":", ":")  # 콜론
            .replace("*", "*")  # 애스터리스크
            .replace("?", "?")  # 물음표
            .replace("\"", """)  # 큰따옴표
            .replace("<", "<")  # 부등호
            .replace(">", ">")  # 부등호
            .replace("|", "|"))  # 파이프
Just a moment...

위 목록을 참고하여 만들었다.

파일명의 앞뒤 공백을 제거하고, 만약 파일명이 예약어와 일치하면 비슷한 다른 문자로 변환, 그 외 사용 불가 문자는 모두 같은 모양의 전각 문자로 바꾼다.

물론 가장 좋은 방법은 저런 문자가 안들어가게 파일이름이 지어지도록 하는거지만…

참고록 COM0~COM9와 LPT0~LPT9는 Windows 11에서 테스트 해봤는데 잘 된다. 다만 아래 버전에서는 안 될 수 있으므로 추가해두었다.

댓글