2013-08-07 2 views
5

xlrd 라이브러리를 사용하여 Excel 파일을 CSV 파일로 변환하려고합니다.python xlrd xlsx를 csv로 변환

하지만이 오류가있어 : 엑셀 파일이 너무 크기 때문에

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 2: ordinal not in range(128)

이 될 수 있습니까? 왜냐하면 모든 행이 작은 파일을 Excel에서 잘 작동합니다. 그러나 거의 2000 개의 행을 가진 Excel 파일을 변환하려고 시도했을 때이 오류가 발생했습니다.

[업데이트]를

이 코드입니다 :

filepath = './attachments' 
wb = xlrd.open_workbook(os.path.join(filepath, 'result.xls')) 
sheet = wb.sheet_by_index(0) 
fp = open(os.path.join(filepath, 'result.csv'), 'wb') 
wr = csv.writer(fp, quoting=csv.QUOTE_ALL) 
for rownum in xrange(sheet.nrows): 
    wr.writerow(sheet.row_values(rownum)) 
fp.close() 

그리고 이것은 역 추적입니다 :

Traceback (most recent call last): 
    File "MethodTest.py", line 11, in <module> 
    wr.writerow(sheet.row_values(rownum)) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 2: ordinal not in range(128) 
+0

코드와 전체 추적을 보여주십시오. 스프레드 시트 크기가 원인이 아닙니다. –

+0

@MartijnPieters : 방금 코드와 추적을 업데이트했습니다. 감사. – Cacheing

답변

10

당신은 ASCII 범위 이외의 데이터를 엑셀 시트를 읽고있다.

유니 코드 값을 CSV 파일에 쓸 때 자동 인코딩이 수행되지만 ASCII 문자 범위를 벗어나는 값은 실패합니다. 파이썬 3 (str()range() 사용),

for rownum in xrange(sheet.nrows): 
     wr.writerow([unicode(val).encode('utf8') for val in sheet.row_values(rownum)]) 

또는 : 명시 적으로 인코딩

for rownum in range(sheet.nrows): 
     wr.writerow([str(val).encode('utf8') for val in sheet.row_values(rownum)]) 

당신은 필요에 따라 다른 인코딩을 선택해야 할 수도 있습니다.

+0

이 오류가 발생했습니다 :'AttributeError : 'float'객체에 'encode'속성이 없습니다. String이 아닌 다른 유형의 데이터가있는 것 같습니다. 그렇다면 이러한 다양한 유형의 데이터를 어떻게 처리 할 수 ​​있을까요? – Cacheing

+0

내 업데이트를 사용해보세요 :-) –

+0

위대한 작품입니다! 감사. – Cacheing