Pergunta

Eu tenho uma folha de cálculo, cujos valores eu quero preencher com valores a partir de dicionários dentro de uma lista.Eu escrevi para um ciclo de atualizações de célula por célula, mas ele é muito lento e eu recebo o gspread.httpsession.HTTPError muitas vezes.Eu estou tentando escrever um loop para atualização linha por linha.Isso é o que eu tenho:

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,}
]

Aqui está a minha célula por célula de loop:

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)

O que ele faz é encontrar um cabeçalho, que corresponde à chave na lista de dicionários e atualizações a célula sob ele.A próxima iteração, a linha é aumentada de um, por isso as atualizações de células na mesma colunas, mas da próxima linha.Este é demasiado lento e eu quero atualizar por linha.A minha tentativa:

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)

Este atualizações de cada linha rapidamente, mas com o mesmo valor.Assim, a terceira nested loop for atribui o mesmo valor para cada célula.Estou quebrando a cabeça tentando descobrir como atribuir valores corretos para as células.Ajuda apreciado.

P. S.pela maneira que eu estou usando cabeçalhos porque eu precisava de uma certa ordem em que os valores da planilha do google deve aparecer.

Foi útil?

Solução

O código a seguir é semelhante ao Koba resposta, mas escreve a folha inteira de uma só vez, em vez de por linha.Isso é ainda mais rápido:

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

Outras dicas

Acabei de escrever o seguinte loop que preenche uma planilha por linha incrivelmente rápido.

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top