2012-11-16 133 views
2

我正在嘗試使用xlrd讀取Excel文件以寫入txt文件。除了有一些西班牙文字符如'Téd'的行以外,所有東西都寫得很好。我可以使用latin-1編碼進行編碼。然而,代碼然後失敗的其他行有'與unicode u'\ u2013''。 u'\ 2013'不能使用latin-1進行編碼。當使用UTF-8''寫得很好,但'Téd'寫成'Téd'這是不可接受的。我如何糾正這一點。下面使用xlrd讀取Excel時使用哪種編碼

代碼:

#!/usr/bin/python 
import xlrd 
import csv 
import sys 

filePath  = sys.argv[1] 

with xlrd.open_workbook(filePath) as wb: 
    shNames = wb.sheet_names() 
    for shName in shNames: 
     sh = wb.sheet_by_name(shName) 
     csvFile = shName + ".csv" 
     with open(csvFile, 'wb') as f: 
       c = csv.writer(f) 
       for row in range(sh.nrows): 
        sh_row = [] 
        cell = '' 
        for item in sh.row_values(row): 
         if isinstance(item, float): 
         cell=item 
         else: 
         cell=item.encode('utf-8') 
         sh_row.append(cell) 
         cell='' 
        c.writerow(sh_row) 
     print shName + ".csv File Created" 
+1

閱讀[絕對最小每個軟件開發人員絕對,積極必須知道Unicode和字符集(沒有藉口!)](http://www.joelonsoftware.com/articles/Unicode.html)。 – katrielalex

回答

2

Python's csv module

doesn’t support Unicode input.

您正確編碼您輸入的書寫之前 - 所以你不需要codecs。只是open(csvFile, "wb")(該b是重要),並通過該對象寫入器:

with open(csvFile, "wb") as f: 
    writer = csv.writer(f) 
    writer.writerow([entry.encode("utf-8") for entry in row]) 

或者,unicodecsv是一個簡易替換爲csv用於處理編碼。


你得到é而不是é因爲you are mistaking UTF-8 encoded text for latin-1。這可能是因爲你編碼了兩次,一次爲.encode("utf-8"),一次爲codecs.open


順便說一句,要檢查的xlrd細胞類型的正確方法是做cell.ctype == xlrd.ONE_OF_THE_TYPES

+0

是的,你是對的。但是,我使用哪種編碼?或者除了使用unicodecsv之外沒有別的辦法嗎? – user1827064

+0

從codecs.open中刪除了編解碼器並再次嘗試。同樣的問題! – user1827064

+0

@katrielalex在使用你的方法時如何處理這樣的錯誤?:AttributeError:'float'對象沒有屬性'encode' – andi