2013-08-07 11 views
5

Sto cercando di convertire i file excel in file csv usando la libreria xlrd.python xlrd convertire xlsx in csv

Ma ho ottenuto questo errore:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 2: ordinal not in range(128)

Può essere perché il file di Excel è troppo grande? Perché tutto funziona correttamente con i file Excel che hanno un numero ridotto di righe. Ma quando ho provato a convertire un file excel che ha quasi 2000 righe, ho ricevuto questo errore.

[UPDATE]

Questo è il codice:

filepath = './attachments' 
wb = xlrd.open_workbook(os.path.join(filepath, 'result.xls')) 
sheet = wb.sheet_by_index(0) 
fp = open(os.path.join(filepath, 'result.csv'), 'wb') 
wr = csv.writer(fp, quoting=csv.QUOTE_ALL) 
for rownum in xrange(sheet.nrows): 
    wr.writerow(sheet.row_values(rownum)) 
fp.close() 

e questa è la traceback:

Traceback (most recent call last): 
    File "MethodTest.py", line 11, in <module> 
    wr.writerow(sheet.row_values(rownum)) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in position 2: ordinal not in range(128) 
+0

Si prega di mostrarci il codice e il traceback completo; questo non è causato dalle dimensioni del foglio di calcolo. –

+0

@MartijnPieters: ho appena aggiornato il codice e il traceback. Grazie. – Cacheing

risposta

10

Stai leggendo un foglio Excel con i dati al di fuori del range ASCII.

Durante la scrittura di valori unicode in un file CSV, la codifica automatica avviene, ma per valori esterni all'intervallo ASCII di caratteri che non riesce. Codificare esplicitamente:

for rownum in xrange(sheet.nrows): 
     wr.writerow([unicode(val).encode('utf8') for val in sheet.row_values(rownum)]) 

o, per Python 3 (utilizzando str() e range()):

for rownum in range(sheet.nrows): 
     wr.writerow([str(val).encode('utf8') for val in sheet.row_values(rownum)]) 

potrebbe essere necessario scegliere una codifica diversa, a seconda delle esigenze.

+0

Ho ricevuto questo errore: 'AttributeError: l'oggetto 'float' non ha attributo 'encode''. Sembra che io abbia diversi tipi di dati piuttosto che solo String. Quindi, come posso gestire questi diversi tipi di dati. – Cacheing

+0

Prova con il mio aggiornamento :-) –

+0

Funziona alla grande! Grazie. – Cacheing