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'}
'데이터 분석 (with Python)' 카테고리의 다른 글
판다스 데이터프레임을 읽고 저장할때 인덱스 컬럼의 처리 (0) | 2024.01.31 |
---|---|
DtypeWarning: Columns have mixed types (Pandas read_csv) (0) | 2024.01.29 |
Python에서 Google Drive 파일 다운로드 (gdown 패키지) (0) | 2024.01.26 |