2014-02-13 4 views
0

xls 파일을 CSV 파일 으로 변환하는 다음 코드에서 정확히 무엇이 잘못되었는지 찾으려고 노력 중입니다. 일부 문자가 올바르게 인코딩되지 않았습니다 (é, à ...). 등) 출력 CSV에. 나는 이미 SOF에서 1 톤의 게시물을 읽었지만 해결책을 찾지 못했습니다. 문제는 Ascii 또는 UTF-8 만 처리하는 CSV 모듈에서 발생하지만 처리 방법을 모르겠습니다. 교환 모듈 unicodecsv도 사용했지만 성공하지 못했습니다. 나는 여기에 유니 코드 csv unicode example에 대한 몇 가지 예제가 있지만 그것을 사용하는 올바른 방법을 모르겠다는 것을 알고 있습니다.Unicode from xls CSV

확실히 내 xls는 utf_16_LE (통합 문서 인코딩)로 인코딩됩니다.

다음은 SOF에서도 발견 된 코드입니다. 나는 많은 수정을 시도했지만 성공할 방법이 없었습니다. 누군가가 코드의 어느 부분이 변경인지를 알 수 있습니다.

#!/usr/bin/env python 
# -*- coding: utf8 -*- 
import xlrd 
from os import sys 
import csv 


def csv_from_excel(excel_file): 

    workbook = xlrd.open_workbook(excel_file) 
    print workbook.biff_version, workbook.codepage, workbook.encoding 
    #test read of accent charactere 
    rs = workbook.sheet_by_index(0) 
    print rs.cell_value(1,0) 

    all_worksheets = workbook.sheet_names() 
    for worksheet_name in all_worksheets: 
     worksheet = workbook.sheet_by_name(worksheet_name) 
     your_csv_file = open(''.join([worksheet_name,'.csv']), 'wb') 

     class ExcelFr(csv.excel): 
     #Separateur de champ 
      delimiter = ";" 

     csv.register_dialect('excel-fr', ExcelFr()) 

     wr = csv.writer(your_csv_file,'excel-fr', quoting=csv.QUOTE_ALL) 

     for rownum in xrange(worksheet.nrows): 
      wr.writerow([unicode(entry).encode("utf-8") for entry in worksheet.row_values(rownum)]) 

     your_csv_file.close() 

#if __name__ == "__main__": 
# csv_from_excel(sys.argv[1]) 

csv_from_excel("source-2014-02-12.xls") 

EDIT : NEW CODE : 첫 번째 시트 만 변환합니다 (아무 시트도 필요하지 않음).

#!/usr/bin/env python 
# -*- coding: utf8 -*- 
import xlrd 
import unicodecsv 
import codecs 

def csv_from_excel(excel_file): 

    wb = xlrd.open_workbook(excel_file) 
    print wb.biff_version, wb.codepage, wb.encoding 
    sh = wb.sheet_by_name('Feuil1') 
    print sh.row_values(8) 
    #your_csv_file = open('your_csv_file.csv', 'wb') 
    your_csv_file = codecs.open('your_csv_file.csv','wb') 

    class ExcelFr(unicodecsv.excel): 
     #Separateur de champ 
     delimiter = ";" 

    unicodecsv.register_dialect('excel-fr', ExcelFr()) 

    wr = unicodecsv.writer(your_csv_file,'excel-fr',encoding='utf-8', quoting=unicodecsv.QUOTE_ALL) 

    for rownum in xrange(sh.nrows): 
     wr.writerow(sh.row_values(rownum)) 
     #wr.writerow([unicode(entry).encode("utf-8") for entry in sh.row_values(rownum)]) 

    your_csv_file.close() 

csv_from_excel("source-2014-02-13.xls") 


reader = unicodecsv.reader("your_csv_file.csv") 
print reader.encoding 

OUTPUT :

80 1,200 utf_16_le [u'Chaise 드 마사지 ergonomique의 pliante 'u'Facile \ xe0 monter 등 ajustable \ xe0 TOUT gabarit 등 부어 TOUT TRAITEMENT 뒤 년산 뒤 군단 콤 t 라 \ xeate, le dos, les \ xe9paules et les bras. 출입국 관리 사무소는 귀하가 저당권을 가지고 있었는지 확인하고 있습니다. 자극을 줄이기위한 마사지는 피부를 자극하지 않고 피부를 보호하고 피부를 보호하고 피부를 보호 해줍니다. 공지 사항 \ xe9galement \ xeatre 유틸리티 \ xe9e comme chaise de tatouage. 'u'Fauteuil 마사지 블랑 드 휘기 등 손쉬운 \ xe0 수송 ..... 등 등 UTF-8

당신은 내가 말을 같은 문자가 볼 수있는'\의 xe0 '또는'\의 u2019 '

나는 아직도 인코딩 것들을 둘러싼 모든 혼란을 이해하지 못한다! 귀하의 경우에는

+0

파이썬 2 또는 3입니까? –

+0

그것은 pyhton 2 – Andronaute

답변

0

, 이것은 잘못된 것입니다 : 당신이 데이터가 제대로 자신을 인코딩되어 있는지 확인해야하므로

your_csv_file = open(''.join([worksheet_name,'.csv']), 'wb') 

표준 파이썬 open() 기능

는, 바이너리 파일을 엽니 다. 당신은 codecs 모듈을 가져 와서 사용해야합니다

your_csv_file = codecs.open(''.join([worksheet_name,'.csv']), 'w', 'utf-8') 

내가 unicode(entry).encode("utf-8")는하지만, 같은 효과를해야한다는 당신과 함께 동의합니다.

제 생각으로는 도움이되지 않는 경우 "왜 일부 문자가 올바르게 인코딩되지 않았는지"에 대해 정확하게 설명해야합니다. 당신은 당신이

개방 유휴 무엇을보고 이해 해달라고 입력처럼

+1

또는 더 나은 아직 문제를 보여주는 작은 예제 xls를 게시 ... –

+0

안녕하세요, 도와 주셔서 감사합니다 : 여기에 소스 xls 파일 (https://dl.dropboxusercontent.com/u/49503438/)입니다. source-2014-02-12.xls) codecs.open 메서드를 사용하면 다음과 같은 결과가 발생합니다. UnicodeDecodeError : 'ascii'코덱은 15 진수 바이트 0xc3을 디코딩 할 수 없습니다. 서수는 범위에 포함되지 않습니다. ( – Andronaute

0

보인다

print u" mani\xe8re tr\xe8s" \ X ## 단순히 어떤 ASCII 표현이없는 16 진수가,

print u"l\u2019assise et l\u2019accoudoir" 것을 보여줄 것입니다 \ u ####는 단순히 반복없는 유니 코드 문자입니다.

+0

) 쓰기 메서드 중에 인코딩되지만 여전히 차단됩니다. – Andronaute

+0

Thx Joran, 실제로이 16 진수를 알고 있지만 이해하지 못했던 이유가 내가 그것을 열면 그 문자가 표시된다는 것입니다. 나는 CSV 파일을 읽을 때 어떻게 보이는지보기 위해 내 서버에서 몇 가지 테스트를 실시 할 것이다. – Andronaute