Python3 CSV 라이브러리에서 사용하는 인코딩 명시

Python3 CSV 라이브러리를 사용하여 CSV 파일을 읽고 쓸 때 일반적으로 UTF-8 (유니 코드)이 권장되는 패턴입니다.

그러나 open 함수를 그대로 사용하면 CSV 파일의 문자 코드가 UTF-8이라고 화가 날 수 있습니다.
나의 환경에서는 Shift-JIS가 정답으로, 문자 코드를 바꾸면 읽어 주었다.

로드에 사용한 코드



CSV 파일의 내용을 읽고 한 줄씩 표시합니다.
첫 번째 줄은 혼동되지만 소스 코드의 문자 코드는 UTF-8로 명시되어 있습니다.

readCSV.py
# -*- coding: utf-8 -*-
import csv

# with文:中の処理が終われば自動でclose処理も行う
with open('book1.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

CSV 파일(Excel2016에서 생성)



book1.csv


Excel 2016에서 CSV를 저장할 때 선택한 형식이 CSV UTF-8 (쉼표로 구분)이면 유니 코드 텍스트에 CSV (쉼표로 구분)라고 Shift-JIS가되었습니다.

UTF-8의 CSV를 Python3에서로드하려고하면 화가납니다.
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence

반대로 Shift-JIS는 읽을 수 있습니다.
['番号', '名前', '個数']
['1', 'りんご', '3']
['2', 'みかん', '6']
['3', 'ぶどう', '4']

문자 코드에 대한 설명



공식적으로는 쓰여 있었지만, 구체예까지 보지 않으면 알기 어려운 인상이 있다.

Python 3.6.3 문서 14.1. csv - CSV 파일 읽기/쓰기

14.1.5. 사용 예



open() 이 CSV 파일을 읽는 데 사용되기 때문에 파일은 기본적으로 시스템의 기본 인코딩으로 유니 코드 문자열로 디코딩됩니다 (locale.getpreferredencoding() 참조). 다른 인코딩을 사용하여 디코딩하려면 open 인수 encoding을 설정하고 다음과 같이하십시오.
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)

아마 이 디폴트 인코딩이 원인으로, 내 환경에서는 Shift-JIS였던 것일까.

문서와 같이 encoding = 'utf-8'을 명시하면 UTF-8 CSV 파일도 읽었습니다.

좋은 웹페이지 즐겨찾기