2016-10-28 1 views
3

파이썬 2.7.12를 사용하고 있습니다. 이 코드 스 니펫으로 utf-8 csv 파일을 저장합니다. 나는 파일의 시작 부분에 BOM을 썼다. 나는 이것이 그들이 보게 어떻게 행 키를 인쇄 할 경우 KeyError: 'a' : [u'\ufeffa', u'b']을 위의 코드는 실패 할 것입니다파이썬 읽기 첫 번째 키에 포함 된 CSV - BOM

import codecs 
import csv 
inputFile = open("test.csv", "rb") 
reader = csv.DictReader(inputFile, delimiter=";") 
for row in reader: 
    print row["a"] 
inputFile.close() 

:

import codecs 
import csv 

outputFile = open("test.csv", "wb") 
outputFile.write(codecs.BOM_UTF8) 
fieldnames = ["a", "b"] 
writer = csv.DictWriter(outputFile, fieldnames, delimiter=";") 
writer.writeheader() 
row = dict([]) 
for i in range(10): 
    row["a"] = str(i).encode("utf-8") 
    row["b"] = str(i*2).encode("utf-8") 
    writer.writerow(row) 
outputFile.close() 

는 그 csv 파일을로드 할. BOM은 a 키에 임베드되었습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

4

BOM이있는 UTF-8임을 공개해야합니다.

import io 

. 
. 
. 
inputFile = io.open("test.csv", "r", encoding='utf-8-sig') 
. 
. 
. 

그리고 당신은 대신 "RB"의 텍스트 모드에서 파일을 열고 "R"이 : 나는 io.open와 함께 작동하는 것을 알고있다.

+0

대단히 감사합니다. 그것은 잘 작동했습니다! :) –

+0

실은, 나는 단지 당신의 대답이 특수 문자 (à, è, ì, ...)가 없을 때만 좋은 것을 발견했다. 그렇지 않으면 UnicodeEncodeError를 얻을 것이다. 답변을 향상시킬 수 있는지 알고 계십니까? –

+3

오 예. 그것은 다른 문제입니다. csv.Reader는 UTF-8에 대해 몰라 [https://docs.python.org/2/library/csv.html#csv-examples](https://docs.python.org/2/library/csv) inputfile에있는 l에 대해 (l.encode ('utf-8'), 구분 기호 = ";")'당신이 속임수를 써야합니다 : 입력 파일을 바꿉니다. (예 : .html # csv-examples)'reader = csv.DictReader 생성자 das가 인코딩을 수행합니다. – hvwaldow