2014-09-25 17 views
5

Sembra che ci siano molti post su questo argomento e la mia soluzione è in linea con quella che sembra essere la risposta più comune, tuttavia sto riscontrando un errore di codifica che non so come indirizzo.Python Converti Excel in 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) 
>>> 

Qualsiasi aiuto o intuizione è molto apprezzato.

risposta

10

Come @davidism sottolinea, il modulo Python 2 csv non funziona con unicode. È possibile aggirare il convertendo tutti i tuoi unicode oggetti a str oggetti prima di sottoporlo ai 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

Il modulo Python 2 csv presenta alcuni problemi con i dati Unicode. Puoi codificare tutto su UTF-8 prima di scrivere o utilizzare il modulo unicodecsv per farlo per te.

Primo pip install unicodecsv. Quindi, anziché import csv, solo import unicodecsv as csv. L'API è la stessa (più le opzioni di codifica), quindi non sono necessarie altre modifiche.

0

Un altro modo per fare questo: cast a stringa, in modo di avere una stringa, si può codificare come "utf-8".

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

l'intera funzione:

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()