2014-02-13 64 views
0

我想了2天以後發現在下面的代碼中將xls文件轉換爲CSV文件時出現了什麼錯誤 我的問題是某些字符編碼不正確(é,à...等)在輸出CSV。我已經閱讀了大量SOF文章,但是我沒有找到解決方案。我知道問題來自只處理Ascii或UTF-8的csv模塊,但我不知道如何處理它。 我也使用替換模塊unicodecsv沒有成功。我知道這裏有一些例子,對於unicode csv unicode example但我不知道使用它的正確方法。Unicode從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") 

編輯:新代碼:它只轉換第一張(我不需要anymre牀單)。

#!/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 1200 utf_16_le [u'Chaise德按摩ergonomique pliante」,u'Facile \ xe0蒙特等可調整的\ xe0 TOUT gabarit等傾TOUT TRAITEMENT杜浩特杜軍團COMME LA噸\ xeate,le dos,les \ xe9paules et les bras。 Le soutien pour la t x est est am am am a a a a a comme comme ass et et et et et et et et。。。。。。。。 Le massage sur chaise est une une mani \ xe8re tr \ xe8s efficace de stimuler la circulation du sang,de l \ uerenergie et permet au corps de retrouver un certain \ xe9quilibre。 Noter que la chaise peut \ xe9galement \ xeatre utilis \ xe9e comme chaise de tatouage。 」,u'Fauteuil去按摩相思,順從等輕便\ xe0轉運.....等等等等 UTF-8

正如你可以看到有像我這樣說字符‘\ xe0’或‘\ u2019’

我還是不明白編碼的東西都亂七八糟!

+0

是Python 2還是3? –

+0

這是pyhton 2 – Andronaute

回答

0

在你的情況,這是錯誤的:

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

標準Python 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:序號不在範圍內(128) – Andronaute

0

好像你只是不明白,你所看到的

開放空閒並進入

print u" mani\xe8re tr\xe8s" \ X ##僅僅是一個十六進制數字有沒有ASCII表示,

print u"l\u2019assise et l\u2019accoudoir"將證明\ ####只是一個沒有任何代表性的unicode字符

+0

我試過很多編寫方法期間的編碼,但仍然被阻止。 – Andronaute

+0

Thx喬蘭,其實我知道這個十六進制數字,但什麼不明白這就是爲什麼當我用Excel打開它顯示這些字符。我將在我的服務器上進行一些測試,以查看當我讀取csv文件時的外觀。 – Andronaute