2014-09-25 217 views
5

似乎有很多這個問題上的帖子,我的解決方案是與最常見的答案似乎是一致的,但是我遇到了編碼錯誤,我不知道如何地址。Python將Excel轉換爲CSV

>>> def Excel2CSV(ExcelFile, SheetName, CSVFile): 
    import xlrd 
    import csv 
    workbook = xlrd.open_workbook(ExcelFile) 
    worksheet = workbook.sheet_by_name(SheetName) 
    csvfile = open(CSVFile, 'wb') 
    wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 

    for rownum in xrange(worksheet.nrows): 
     wr.writerow(worksheet.row_values(rownum)) 

    csvfile.close() 

>>> Excel2CSV(r"C:\Temp\Store List.xls", "Open_Locations", 
       r"C:\Temp\StoreList.csv") 

Traceback (most recent call last): 
File "<pyshell#2>", line 1, in <module> 
Excel2CSV(r"C:\Temp\Store List.xls", "Open_Locations", r"C:\Temp\StoreList.csv") 
File "<pyshell#1>", line 10, in Excel2CSV 
wr.writerow(worksheet.row_values(rownum)) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 14: 
ordinal not in range(128) 
>>> 

任何幫助或洞察力,非常感謝。

回答

10

正如@davidism指出的那樣,Python 2 csv模塊不適用於unicode。您可以變通的作法是將所有的unicode對象str對象提交到csv前:

def Excel2CSV(ExcelFile, SheetName, CSVFile): 
    import xlrd 
    import csv 
    workbook = xlrd.open_workbook(ExcelFile) 
    worksheet = workbook.sheet_by_name(SheetName) 
    csvfile = open(CSVFile, 'wb') 
    wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 

    for rownum in xrange(worksheet.nrows): 
     wr.writerow(
      list(x.encode('utf-8') if type(x) == type(u'') else x 
        for x in worksheet.row_values(rownum))) 

    csvfile.close() 
2

Python 2 csv模塊有一些unicode數據的問題。您可以在寫入之前將所有內容編碼爲UTF-8,或者使用unicodecsv模塊爲您完成。

第一個pip install unicodecsv。然後,而不是import csv,只是import unicodecsv as csv。 API是相同的(加上編碼選項),所以不需要其他更改。

0

另一種方式這樣做:強制轉換爲string,所以你有一個字符串,可以編纂它作爲「UTF-8」。

str(worksheet.row_values(rownum)).encode('utf-8') 

的整體功能:

def Excel2CSV(ExcelFile, SheetName, CSVFile): 
    import xlrd 
    import csv 
    workbook = xlrd.open_workbook(ExcelFile) 
    worksheet = workbook.sheet_by_name(SheetName) 
    csvfile = open(CSVFile, 'wb') 
    wr = csv.writer(csvfile, quoting=csv.QUOTE_ALL) 

    for rownum in xrange(worksheet.nrows): 
     wr.writerow(str(worksheet.row_values(rownum)).encode('utf-8')) 

    csvfile.close()