[Python]UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 에러 해결 방법

CupRaccoon·2022년 8월 12일

* Python 3.8.2 버전 기준으로 작성되었습니다. 버전에 따라 제대로 동작하지 않을 수도 있습니다.

프로젝트를 진행 중에 'cp949' codec can't decode byte 0xec in position 659 라는 에러메세지를 만나서 해결 과정과 해결 방법을 적어본다.

1. 에러와 해결 과정

문제가 생겼던 코드를 간략하게 표현하자면 아래와 같이 폴더를 순회하면서 그 안의 파일을 읽고 파일을 처리하는 함수를 실행하는 코드였다. 이 때 특정 파일을 읽을 때 에러가 일어났다.

for i in folderList:
    for j in fileList[i]:
        f = open(path+i+'/'+j,'r')
        data = f.read()
        print(data) //파일을 처리하는 함수
        f.close()
        
>>>UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 659: illegal multibyte sequence

습관처럼 에러 메세지를 복사해서 구글링한 결과, cp949 방식으로 파일을 디코드할 수 없어서 생기는 에러로 인코딩 형식을 utf-8로 지정해주면 해결된다고 한다.

f = open(path+i+'/'+j,'r',encoding='utf-8')

이런 식으로 작성하고... 실행시켰더니

>>>UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 185: invalid start byte

여전히 에러가 발생했다... 비슷하지만 다른 에러 메시지를 뱉으면서.
마찬가지로 이번 에러 메세지를 구글링했더니 이번에는 인코딩 형식을 cp949으로 지정해주면 해결된다고 한다. 결과가 예상되지만... 일단 시도해보자.

f = open(path+i+'/'+j,'r',encoding='cp949')

이번에는 cp949로 인코딩 형식을 지정하고... 실행시켰더니

>>>UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 659: illegal multibyte sequence

처음의 에러로 돌아왔다... 디버깅을 해 본 결과, 한글이 포함된 파일에만 에러가 발생됨을 알 수 있었다. 따라서 한글 인코딩이 문제인 걸 알 수 있었다.

2. 해결 방법

python의 문자열 인코딩 인식 라이브러리인 chardet을 사용해서 해결할 수 있다.

import chardet

rawdata = open(path+i+'/'+j, 'rb').read()
result = chardet.detect(rawdata)
enc = result['encoding']
f = open(path+i+'/'+j,'r', encoding=enc)

이런 식으로 chardetdetect 메소드를 이용해서 파일을 읽어서 인코딩 형식을 알아낼 수 있고, 알아낸 인코딩 형식을 이용해서 문제없이 문자열을 읽어낼 수 있다.

3. 에러의 원인

기본적으로 한글 문자열 인코딩 방식이 cp949utf-8으로 이원화되어 있어서 문제가 발생했다.
직접 cp949utf-8f = open(path,'r','utf-8')과 같이 지정하는 방식은 단일 파일을 읽는 경우에는 (인코딩 방식이 두 가지 뿐이기 때문에) 좋은 해결 방법이지만, 나는 인코딩 형식이 섞인 여러 파일을 읽어야 했기 때문에 여전히 에러가 발생했다. 따라서 chardet과 같이 라이브러리를 이용해서 인코딩 형식을 읽어줘야 했다.

4. 참고자료

  1. chardet Docs:
    https://chardet.readthedocs.io/en/latest/index.html
  2. Wikipedia, Character encoding: https://en.wikipedia.org/wiki/Character_encoding
    
profile
github : https://github.com/CupRaccoon

0개의 댓글