Domanda

Sto cercando di leggere in un file di Excel utilizzando XLRD, e mi chiedo se c'è un modo per ignorare la cella di formattazione utilizzata nel file di Excel, e basta importare tutti i dati come testo?

Ecco il codice che sto usando per molto:

import xlrd

xls_file = 'xltest.xls'
xls_workbook = xlrd.open_workbook(xls_file)
xls_sheet = xls_workbook.sheet_by_index(0)

raw_data = [['']*xls_sheet.ncols for _ in range(xls_sheet.nrows)]
raw_str = ''
feild_delim = ','
text_delim = '"'

for rnum in range(xls_sheet.nrows):
    for cnum in range(xls_sheet.ncols):
        raw_data[rnum][cnum] = str(xls_sheet.cell(rnum,cnum).value)

for rnum in range(len(raw_data)):
    for cnum in range(len(raw_data[rnum])):
        if (cnum == len(raw_data[rnum]) - 1):
            feild_delim = '\n'
        else:
            feild_delim = ','
        raw_str += text_delim + raw_data[rnum][cnum] + text_delim + feild_delim

final_csv = open('FINAL.csv', 'w')
final_csv.write(raw_str)
final_csv.close()

Questo codice è funzionale, ma ci sono alcuni campi, come ad esempio un codice postale, che vengono importati come numeri, in modo da avere il suffisso decimale zero. Ad esempio, è che c'è un codice postale di '79854' nel file di Excel, esso sarà importato come '79.854,0'.

Ho cercato di trovare una soluzione in questo XLRD spec , ma senza successo.

È stato utile?

Soluzione

Questo perché valori interi in Excel vengono importati come carri in Python. Così, sheet.cell(r,c).value restituisce un float. Provare a convertire i valori a numeri interi, ma prima assicurarsi che tali valori sono stati interi in Excel per cominciare:

cell = sheet.cell(r,c)
cell_value = cell.value
if cell.ctype in (2,3) and int(cell_value) == cell_value:
    cell_value = int(cell_value)

è tutti nella XLRD spec .

Altri suggerimenti

So che questo non fa parte della questione, ma mi sarebbe sbarazzarsi di raw_str e scrivere direttamente al vostro csv. Per un file di grandi dimensioni (10.000 righe) questo farà risparmiare un sacco di tempo.

Si può anche sbarazzarsi di raw_data e basta usare un ciclo for.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top