[Python] 파이썬, 한글 파일명 자모 분리? 걱정 노노!
파이썬, 한글 파일명 자모 분리? 걱정 노노!
파이썬으로 파일을 다루다 보면, 특히 macOS 환경에서 한글로 된 파일명이 'ㅎㅏㄴㄱㅡㄹ'처럼 자음과 모음이 따로 떨어져 보이는 당황스러운 경험을 할 수 있다. 분명 '한글'이라고 저장했는데 왜 이렇게 보이는 걸까? 이 현상은 생각보다 흔하며, 다행히 간단한 해결 방법이 있다.
1. 왜 이런 문제가 발생할까? (유니코드 정규화)
이 문제의 핵심에는 유니코드 정규화(Unicode Normalization) 방식의 차이가 있다.
- 같은 글자, 다른 표현: 컴퓨터는 글자를 유니코드라는 표준 방식으로 다루는데, 놀랍게도 '한'이라는 하나의 한글 글자를 표현하는 방식이 여러 가지일 수 있다.
- NFC (표준 조합): 우리가 흔히 생각하는 방식이다. '한'이라는 글자를 하나의 완성된 코드 값으로 인식한다. 대부분의 운영체제(Windows, Linux)와 웹 환경에서 이 방식을 선호한다.
- NFD (표준 분해): 글자를 구성 요소로 분해해서 인식한다. '한'을 'ㅎ' + 'ㅏ' + 'ㄴ' 이라는 자음과 모음의 조합으로 본다. macOS의 파일 시스템(APFS, HFS+)이 내부적으로 이 방식을 주로 사용한다.
- 문제의 시작: macOS에서 NFD 방식으로 저장된 파일명을 파이썬 코드가 그대로 읽거나, NFC 방식을 기대하는 다른 프로그램이나 시스템(예: 윈도우 PC, 서버)으로 파일을 옮기면, NFD 방식의 자모 조합이 그대로 노출되어 글자가 깨져 보이는 것이다.
2. 해결책: unicodedata
모듈로 깔끔하게!
파이썬은 이런 문제를 해결할 수 있도록 unicodedata
라는 강력한 내장 모듈을 제공한다. 해결 방법은 간단하다. 파일명을 사용하기 전에 NFC 방식으로 통일시켜주는 것이다.
핵심 함수:
unicodedata.normalize(form, unistr)
form
인자에는'NFC'
(우리가 원하는 방식) 또는'NFD'
등을 지정한다.unistr
인자에는 정규화할 파일명 문자열을 넣는다.
사용법: 자모 분리가 의심되는 파일명(특히 macOS에서 생성/관리되는)을
unicodedata.normalize('NFC', 파일명)
으로 감싸주면 된다.예시 코드:
import unicodedata import os # macOS에서 os.listdir() 등으로 읽어온 파일명이라고 가정 (NFD 형태일 수 있음) # 직접 테스트를 위해 NFD 형태를 만들어보자. original_filename = '한글파일명.txt' filename_potentially_nfd = unicodedata.normalize('NFD', original_filename) print(f"처리 전 파일명 (NFD 가정): {filename_potentially_nfd}") # 출력: ㅎㅏㄴㄱㅡㄹㅍㅏㅇㅣㄹㅁㅕㅇ.txt (터미널 환경에 따라 다르게 보일 수 있음) # NFC 방식으로 정규화 filename_nfc = unicodedata.normalize('NFC', filename_potentially_nfd) print(f"NFC로 정규화 후: {filename_nfc}") # 출력: 한글파일명.txt # 이제 정규화된 이름(filename_nfc)으로 파일 관련 작업 수행 try: # 파일을 생성하거나 열 때 정규화된 이름을 사용한다. with open(filename_nfc, 'w', encoding='utf-8') as f: f.write("이 파일은 NFC 방식으로 저장되었습니다.") print(f"'{filename_nfc}' 이름으로 파일 생성/저장 완료!") # 파일 존재 여부 확인 등 다른 작업에도 NFC 이름 사용 if os.path.exists(filename_nfc): print(f"'{filename_nfc}' 파일 확인 완료!") # 사용 후 테스트 파일 삭제 (필요시) # os.remove(filename_nfc) except OSError as e: print(f"파일 처리 중 오류 발생: {e}")
포인트: 파일을 저장(
open(..., 'w')
)하거나, 파일 경로를 다른 함수/라이브러리에 전달하기 전에normalize('NFC', ...)
를 적용하는 것이 중요하다.
3. 추가 팁 및 주의사항
이 문제를 해결할 때 몇 가지 더 알아두면 좋은 점들이 있다.
- 플랫폼 간 호환성: macOS에서 만든 파일을 윈도우나 리눅스로 옮겨 사용할 때 이 정규화 처리는 거의 필수적이다. 파일 공유, Git 버전 관리, 서버 배포 등 다양한 상황에서 문제를 예방할 수 있다.
- 파일 목록 읽어올 때: 파이썬의
os.listdir()
함수로 디렉토리의 파일 목록을 가져올 때, macOS 환경이라면 NFD 형식의 파일명이 반환될 수 있다. 따라서 목록의 각 파일명을 사용할 때도 NFC 정규화가 필요할 수 있다. - 외부 라이브러리: 사용하는 외부 라이브러리가 내부적으로 파일 경로를 어떻게 처리하는지 명확하지 않다면, 안전하게 NFC로 정규화된 경로를 전달하는 것이 좋다.
결론
파이썬에서 한글 파일명이 깨지는 현상은 당황스러울 수 있지만, 그 원인이 유니코드 정규화 방식의 차이에 있다는 것을 이해하면 해결은 간단하다. unicodedata.normalize('NFC', ...)
함수를 적절히 활용하여 파일명을 NFC 방식으로 통일해주면, 자모 분리 현상을 막고 여러 시스템 간의 호환성도 높일 수 있다.