데이터 분석 (with Python)

파일 인코딩 형식 확인 - chardet.detect() 함수

그리다웍스 2024. 1. 26. 14:07
with open('화일명.csv') as f:
  print(f.readline())
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb9 in position 0: invalid start byte

 

위와 같이 csv 화일을 readline()로 읽을때, 인코딩이 맞지 않으면
UnicodeDecodeError 오류가 발생한다.
open() 함수는 기본적으로 UTF-8로 읽는다.

이런 오류가 발생시 인코딩 포맷을 먼저 확인해보아야 한다. 이때 사용하는 것이 chardet.detect() 함수이다.
chardet.detect()는 주어진 바이트 데이터의 문자 인코딩을 판별하여 어떤 인코딩을 사용하는지에 대한 정보를 제공한다.

import chardet

# 감지할 데이터
data = 'Hello, 안녕하세요, こんにちは'

# 문자열을 UTF-8로 인코딩한 후 chardet.detect() 함수를 사용하여 문자 인코딩 감지
# encode()은 encode('utf-8') 와 동일하다. 디폴트로 encode() 함수는 UTF-8 인코딩을 사용
result = chardet.detect(data.encode())

# 결과 출력
print(result)

 

위 코드에서 data는 감지하고자 하는 바이트 데이터
chardet.detect() 함수는 바이트 데이터에 대해서만 동작하므로, 문자열에 대해서 직접 사용하면 에러가 발생한다.
문자열을 감지하기 위해서는 먼저 해당 문자열을 바이트로 변환한 후
chardet.detect() 함수를 사용하자.

chardet.detect() 함수를 호출하면 결과로 딕셔너리를 반환한다.

  • 'encoding': 감지된 문자 인코딩의 이름
  • 'confidence': 감지된 인코딩에 대한 확신 정도 (0.0부터 1.0까지).
{'encoding': 'UTF-8', 'confidence': 0.938125}

 

외부로 부터 받은 데이터의 인코딩을 감지할때 유용하다.

만약 화일의 데이터 포맷을 알고싶다면,

# 화일을 읽기전에 화일의 인코딩 형식을 먼저 확인
# 화일을 바이너리 읽기모드로 읽고, chardet.detect() 함수로 확인
import chardet

with open('화일명.csv', mode='rb') as f:
  d = f.readline()

print(chardet.detect(d))

{'encoding': 'EUC-KR', 'confidence': 0.99, 'language': 'Korean'}