为什么Python会跳过代码?Openpyxl、2D字典和异常

2024-03-29 09:22:16 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试着用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             $0.00      $68.96      $68.96

我不明白为什么它忽略了最后两个语句。如果没有数据,我可以理解显示$0.00(但是有)……无论如何,[Prev]print语句不应该出现吗?你知道吗

谢谢!你知道吗


Tags: toformatvaluefloattabnextrowprint
1条回答
网友
1楼 · 发布于 2024-03-29 09:22:16

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)].valueskuMatrix[tab[skuCol + str(row)].value]None,这将抛出一个TypeError并被静默忽略。你知道吗

或者,它可能是skuMatrix[tab[skuCol + str(row)].value]是一个整数,它将给出

TypeError: 'int' object has no attribute '__getitem__'当您尝试索引它时。你知道吗

或者为嵌套的.valuearray[index]调用提供十几个其他选项。你知道吗

因为你默默地忽略了他们,你不知道那是什么。你知道吗

所以不要忽略类型错误。坏事情会发生。你知道吗

唯一应该忽略异常的时间是:

a)指定要忽略的异常(如您所做的)

b)您的代码在不处理该异常的情况下工作(它不会)

因此,您不能忽略这个异常。你知道吗

相关问题 更多 >