首页 > 解决方案 > Openpyxl python3项目,其中TypeError:'NoneType'类型的参数不可迭代并且添加异常似乎不起作用

问题描述

我有'TypeError:'NoneType'类型的参数不可迭代并且添加异常似乎不起作用'错误,我在这里其他地方看到过,并且从其他答案中发现这是由于循环返回一个 None 值但添加一个 None 异常不起作用,我看不出还有其他方法可以做到这一点。

我在 Python3 中使用 openpyxl 并在 A 列中有通过另一个项目更新的主题,因此可能有 0 到多行(我在脚本开始时将它们全部取消合并)。我需要在 J 列中搜索每个项目的所有行以查找要复制到另一列的日期,并且由于第 2 列对于已更新的行是空白的,因此我使用带有 if 语句的 for 循环将空白行添加到数组供以后删除。

所有非空白行,我使用 else 语句在 tempList 中计算该项目中有多少空白行,然后 for 循环将 myStringTest 设置为列 J 值,这样我就可以搜索我想要的文本 - 如果我找到我想将一段文本(日期)复制到另一列 - 我现在只有 print('test') 。

for i in range(2, sheet.max_row + 1):
if sheet.cell(row=i, column=1).value == None:
    print('This row has nothing in it')
    arrayForDeletion2.append(i)
else:
    tempList = 1
    x = i
    while sheet.cell(row=x+1, column=1).value == None:
        tempList += 1
        x += 1
        if tempList >30:
            break
    print(i)
    print(tempList)
    for y in range(i, i+tempList):
        myStringTest = (sheet.cell(row=i, column=10).value)
        if 'Original' in myStringTest and not None:
            print('test')
        i += 1

>>>Traceback (most recent call last):
  File "main.py", line 113, in <module>
  if 'Original' in myStringTest and not None:
  TypeError: argument of type 'NoneType' is not iterable

所以 A2 可能有 6 个更新行,J4、J5 和 J7 每个都有一个字符串说“原始目标日期:XX/XX/XX” - 我希望在 if 语句中识别它,如果是这样,只需复制日期到另一列。如果没有字符串,什么也不做。

抱歉,这可能不是很清楚,但我对 python 还很陌生,并且已经四处寻找答案,但无法解决这个问题。真的很感谢任何帮助。谢谢。

标签: pythonopenpyxl

解决方案


如果sheet.cell(r,c).value返回None,您正在'Original' in None有效地进行测试<str> in <NoneType>。由于隐式转换 (of <NoneType>to <str>) 不可用,python 会引发错误。您已尝试使用 捕获此问题and None,但未按照您的预期评估此代码。试试下面的,你会得到同样的错误:

p = None
if 'test' in p:
   print(p)

在应该解决问题之前将None检查移至单独的语句。inPython 会引发错误,因此您的应用程序可以执行回退代码来纠正意外行为或通知用户输入错误。如果您想在本地捕获和处理它,请使用 try/except 块:

p = None
try:
    if 'lol' in p:
        print('p')
    else:
        print('none')
except TypeError:
    print('Code to be executed if p is None goes here.')

顺便说一句,下面打印p,因为not None总是评估为True。您将需要一个显式myStringTest is not None的,其中is关键字触发比较。

p = None
if not None:
    print('p')
else:
    print('none')

最后,一个建议。在语义上,x == None测试 x 是否等价于None对象。

但是只有一个None对象,那就是对象 None。因此,您要执行的测试使用 is 关键字: x is None,它检查 x 和 None 是否引用同一个对象。

这有什么关系?嗯,其中一部分是风格。这导致了这样的讨论。但其中一部分是功能。是对可读性的评论,是对一个很酷的边缘案例的评论:!= | ==使用__eq__()一个类的方法,你不知道它是如何实现的。如果我想知道是否xy引用同一个对象,is保证正确的行为。


推荐阅读