为什么 Python 跳过代码? Openpyxl、二维字典和异常

Why is Python skipping code? Openpyxl, 2-D Dictionaries and Exceptions

所以我尝试使用 Openpyxl 从 excel 文件中读取数字并按 SKU 将它们相加。它有点管用,但 Python 似乎跳过了一些代码行,我不太明白为什么。

基本上,我想添加构成特定 SKU 的所有部件的成本,并报告 N-1 月、当月和 N+1 的总 SKU 成本。但是当我 运行 我的代码时,它获取了部分信息而忽略了其余部分。

代码:

for row in range(2, tab.max_row):
    try:
        if (tab[regCol + str(row)].value != "NAN" or \
            tab[lobCol + str(row)].value != "Family"):

        #Initialize missing SKUs
        print("R{}:".format(row))
        if tab[skuCol + str(row)].value not in skuMatrix:
            print("Creating {}".format(tab[skuCol + str(row)].value))
            skuMatrix[tab[skuCol + str(row)].value] = {}
            skuMatrix[tab[skuCol + str(row)].value][tab[prevCost + str(1)].value] = float(0)
            skuMatrix[tab[skuCol + str(row)].value][tab[currCost + str(1)].value] = float(0)
            skuMatrix[tab[skuCol + str(row)].value][tab[nextCost + str(1)].value] = float(0)

        #Update SKU value
        skuMatrix[tab[skuCol + str(row)].value][tab[currCost + str(1)].value] += float(tab[currCost + str(row)].value)
        print("\t[Curr] Updated value to {}".format(skuMatrix[tab[skuCol + str(row)].value][tab[currCost + str(1)].value]))

        skuMatrix[tab[skuCol + str(row)].value][tab[nextCost + str(1)].value] += float(tab[nextCost + str(row)].value)
        print("\t[Next] Updated value to {}".format(skuMatrix[tab[skuCol + str(row)].value][tab[nextCost + str(1)].value]))

        skuMatrix[tab[skuCol + str(row)].value][tab[prevCost + str(1)].value] += float(tab[prevCost + str(row)].value)
        print("\t[Prev] Updated value to {}".format(skuMatrix[tab[skuCol + str(row)].value][tab[prevCost + str(1)].value]))

    except TypeError as te:
        if not tab[prevCost + str(row)].value or \
           not tab[currCost + str(row)].value or \
           not tab[nextCost + str(row)].value:
               pass
        else:
            print("Error adding {}".format(str(te)))

...这是我 运行 时实际发生的情况:

    R233:
    Creating 123-ABXY
    [Curr] Updated value to 0.5983
    [Next] Updated value to 0.5983
    R234:
    [Curr] Updated value to 0.8193
    [Next] Updated value to 0.8193
    R235:
    [Curr] Updated value to 0.9753000000000001
    [Next] Updated value to 0.9753000000000001
    R236:
    [Curr] Updated value to 1.0365
    [Next] Updated value to 1.0365
    R237:
    [Curr] Updated value to 68.9565
    [Next] Updated value to 68.9565

    [Cost]
    SKU                  Prior     Current  Current +1
    123-ABXY             [=12=].00      .96      .96

我不明白为什么它会忽略最后两个语句。如果没有数据(但有),我可以理解显示 $0.00.....无论如何,[Prev] 打印语句不应该显示吗?

谢谢!

TL;DR: 默默地忽略异常是 bad idea:

没有 运行 你的代码,我可以猜到你忽略的异常:

TypeError: 'NoneType' object has no attribute '__getitem__'

TypeError: <type> indices must be integers, not NoneType

因为您试图索引对象而不检查它们是否可用:

skuMatrix[tab[skuCol + str(row)].value][tab[prevCost + str(1)].value] += float(tab[prevCost + str(row)].value)
        print("\t[Prev] Updated value to {}".format(skuMatrix[tab[skuCol + str(row)].value][tab[prevCost + str(1)].value]))

如果 tab[skuCol + str(row)].value,或 skuMatrix[tab[skuCol + str(row)].value]None,这将抛出一个 TypeError 并被静默忽略。

或者,skuMatrix[tab[skuCol + str(row)].value] 可能是一个整数,然后会得到

TypeError: 'int' object has no attribute '__getitem__' 当你试图索引它时。

或嵌套 .valuearray[index] 调用的其他十几个选项。

因为你默默无视它们,你不知道它是什么。

所以不要忽略类型错误。 不好的事情会发生。

唯一应该忽略异常的情况是:

a) 指定您要忽略的异常(就像您所做的那样)

b) 你的代码在没有处理异常的情况下工作(它没有)

因此,您不能忽略此异常。