为什么 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__'
当你试图索引它时。
或嵌套 .value
和 array[index]
调用的其他十几个选项。
因为你默默无视它们,你不知道它是什么。
所以不要忽略类型错误。 不好的事情会发生。
唯一应该忽略异常的情况是:
a) 指定您要忽略的异常(就像您所做的那样)
b) 你的代码在没有处理异常的情况下工作(它没有)
因此,您不能忽略此异常。
所以我尝试使用 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__'
当你试图索引它时。
或嵌套 .value
和 array[index]
调用的其他十几个选项。
因为你默默无视它们,你不知道它是什么。
所以不要忽略类型错误。 不好的事情会发生。
唯一应该忽略异常的情况是:
a) 指定您要忽略的异常(就像您所做的那样)
b) 你的代码在没有处理异常的情况下工作(它没有)
因此,您不能忽略此异常。