【问题标题】:How can I more efficiently find the height of a table using Python如何使用 Python 更有效地找到表格的高度
【发布时间】:2015-06-04 14:08:37
【问题描述】:

我正在使用 openpyxl 从 Excel 电子表格中复制数据。数据是库存数据库的表,其中每一行都是数据库中的一个条目。我使用 for 循环一次读取表格一行。为了确定 for 循环的范围,我编写了一个函数,它检查表格中的每个单元格以找到表格的高度。

代码:

def find_max(self, sheet, row, column):
    max_row = 0
    cell_top = sheet.cell(row = row - 1, column = column)
    while cell_top.value != None:
        cell = sheet.cell(row = row, column = column)
        max = 0
        while cell.value != None or sheet.cell(row = row + 1, column = column).value != None:
            row += 1
            max = max + 1
            cell = sheet.cell(row = row, column = column)
        if max > max_row:
            max_row = max
        cell_top = sheet.cell(row = row, column = column + 1) 

    return max_row

为了总结该函数,我移至工作表中的下一列,然后遍历该表中的每个单元格,跟踪其高度,直到没有更多列为止。这个函数的问题是它必须连续找到两个空单元格才能使条件失败。在以前的版本中,我使用了类似的方法,但只使用了一个列,并在我发现一个空白单元格时立即停止。我必须对其进行更改,以便在用户忘记填写一列时程序仍能运行。这个函数适用于一个小表,但在一个有数百个条目的表上,这会使程序运行得更慢。

我的问题是:我能做些什么来提高效率?我知道嵌套这样的while循环会使程序花费更长的时间,但我不知道如何解决它。我必须使程序尽可能地万无一失,所以我需要检查多个列以阻止用户错误导致程序失败

【问题讨论】:

    标签: algorithm python-2.7 openpyxl


    【解决方案1】:

    这是未经测试的,但每次我使用 openpyxl 时,我都会像这样遍历所有行:

    for row in active_worksheet:
        do_something_to(row)
    

    所以你可以这样算:

    count = 0
    for row in active_worksheet:
        count += 1
    

    编辑:这是一个更好的解决方案:Is it possible to get an Excel document's row count without loading the entire document into memory?

    【讨论】:

    • 链接的解决方案对我有用。然而事实证明,程序的另一部分导致了大幅减速
    • 我最近发现了一个用于分析 python 脚本的简洁工具:docs.python.org/2/library/profile.html 也许这可以帮助你加快速度?
    • 我只是在各个点使用打印的time.clock() 并找到了问题区域。我有几个嵌套 for 循环,它们遍历标记行中的每个单元格。我每行大约有 10 个单元格和几百行,所以它必须进行几千次迭代。如果我没有抓取特定的行,我可以使用你的方法,但我不会为此撕毁我的头发。
    • 在 Python 中你很少需要创建自己的计数器:for idx, row in enumerate(ws, 1):
    【解决方案2】:

    只读模式在源上逐行工作,因此您可能希望将其挂钩。或者,您可以将工作表的单元格传递到具有空单元格索引的 Pandas 矩阵之类的东西中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-26
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2012-01-13
      • 2014-04-06
      • 1970-01-01
      相关资源
      最近更新 更多