【问题标题】:Populating google spreadsheet by row, not by cell按行填充谷歌电子表格,而不是按单元格
【发布时间】:2014-07-31 14:43:18
【问题描述】:

我有一个电子表格,我想用列表中字典的值填充其值。我编写了一个逐个单元格更新的 for 循环,但它太慢了,而且我经常得到 gspread.httpsession.HTTPError。我正在尝试编写一个循环来逐行更新。这就是我所拥有的:

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

这是我的一个单元一个单元循环:

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)

它的作用是找到与字典列表中的键对应的标题并更新其下的单元格。下一次迭代该行增加一,因此它更新同一列中的单元格,但下一行。这太慢了,我想逐行更新。我的尝试:

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)

这一行会快速更新每一行,但使用相同的值。因此,第三个嵌套 for 循环为每个单元格分配相同的值。我正在努力弄清楚如何为单元格分配正确的值。帮助表示赞赏。

附:顺便说一句,我使用标题是因为我想要 google 电子表格中的值应该出现的特定顺序。

【问题讨论】:

    标签: python for-loop gspread


    【解决方案1】:

    以下代码与 Koba 的答案类似,但一次写入整个工作表而不是每行。这甚至更快:

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

    【讨论】:

    • 这对我来说效果非常好,并且将我的脚本加速了几个数量级。谢谢。
    • 很高兴听到,我注意到往返时间很长,我不确定这是 Gspread 库效率不高还是谷歌制作它的方式,但尽可能多地做一口气似乎最快。我个人使用它来创建名称中包含当前日期的工作表,并将其完全替换为最新数据。
    【解决方案2】:

    我最终编写了以下循环,该循环以惊人的速度逐行填充电子表格。

    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
    

    【讨论】:

    • 对于每一行,您都在获取一个范围(显然这就是您所能做的),但单元格的更新也是逐行进行的,这可以在最后一次完成。
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多