Domanda

Ho un foglio di calcolo i cui valori che voglio compilare con valori dei dizionari all'interno di un elenco. Ho scritto A per il ciclo che aggiorna la cella per cella, ma è troppo lento e ottengo spesso il Gspread.httpsession.httperror spesso. Sto cercando di scrivere un anello per aggiornare la riga per fila. Questo è quello che ho:

lstdic=[
{'Amount': 583.33, 'Notes': '', 'Name': 'Jone', 'isTrue': False,},
{'Amount': 58.4, 'Notes': '', 'Name': 'Kit', 'isTrue': False,},
{'Amount': 1083.27, 'Notes': 'Nothing', 'Name': 'Jordan', 'isTrue': True,}
]
.

Ecco la mia cella per ciclo cellulare:

headers = wks.row_values(1)

    for k in range(len(lstdic)):
        for key in headers:
            cell = wks.find(key)
            cell_value = lstdic[k][key]
            wks.update_cell(cell.row + 1 + k, cell.col, cell_value)
.

Che cosa fa è trovare un'intestazione che corrisponde alla chiave nell'elenco dei dizionari e aggiorna la cella sotto di essa. La prossima iterazione la riga è aumentata da una, quindi aggiorna le celle nelle stesse colonne, ma la riga successiva. Questo è troppo lento e voglio aggiornare per riga. Il mio tentativo:

headers = wks.row_values(1)

row=2
for k in range(len(lsdic)):
    cell_list=wks.range('B%s:AA%s' % (row,row))
    for key in headers: 
        for cell in cell_list:
            cell.value = lsdic[k][key]
    row+=1
    wks.update_cells(cell_list)
.

Questo si aggiorna rapidamente ogni riga, ma con lo stesso valore. Quindi, il terzo annidato per loop assegna lo stesso valore per ogni cella. Sto rompendo la testa cercando di capire come assegnare i valori giusti alle celle. Aiuto apprezzato.

P.S. Dal modo in cui sto usando le intestazioni perché voglio un certo ordine in cui dovrebbe apparire i valori nel foglio di calcolo di Google.

È stato utile?

Soluzione

Il codice seguente è simile alla risposta di Koba, ma scrive il foglio completo contemporaneamente anziché per riga.Questo è ancora più veloce:

# sheet_data  is a list of lists representing a matrix of data, headers being the first row.
#first make sure the worksheet is the right size
worksheet.resize(len(sheet_data), len(sheet_data[0]))
cell_matrix = []
rownumber = 1

for row in sheet_data:
    # max 24 table width, otherwise a two character selection should be used, I didn't need this.
    cellrange = 'A{row}:{letter}{row}'.format(row=rownumber, letter=chr(len(row) + ord('a') - 1))
    # get the row from the worksheet
    cell_list = worksheet.range(cellrange)
    columnnumber = 0
    for cell in row:
        cell_list[columnnumber].value = row[columnnumber]
        columnnumber += 1
    # add the cell_list, which represents all cells in a row to the full matrix
    cell_matrix = cell_matrix + cell_list
    rownumber += 1
# output the full matrix all at once to the worksheet.
worksheet.update_cells(cell_matrix)
.

Altri suggerimenti

Ho finito per scrivere il seguente ciclo che riempie un foglio di calcolo per fila incredibilmente veloce.

headers = wks.row_values(1)        
row = 2 # start from the second row because the first row are headers
for k in range(len(lstdic)):
        values=[]
        cell_list=wks.range('B%s:AB%s' % (row,row)) # make sure your row range equals the length of the values list
        for key in headers:
            values.append(lstdic[k][key])   
        for i in range(len(cell_list)):
            cell_list[i].value = values[i]
        wks.update_cells(cell_list)
        print "Updating row " + str(k+2) + '/' + str(len(lstdic) + 1)
        row += 1
.

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