【问题标题】:argument of type 'NoneType' is not iterable“NoneType”类型的参数不可迭代
【发布时间】:2011-07-20 22:13:49
【问题描述】:

我正在尝试在一个特定目录中打开一个包含一系列 XML 的目录。
在下面的代码中,我将遍历每个 XML 文档,并设置一些“if 语句”来读取 XML 中的文本、查找关键字并替换它们,然后将新文件写入新位置。
运行脚本时出现以下错误:

Traceback info:
  File "Z:\ESRI\Python\Test Scripts\ElementTree6.py", line 62, in <module>
    if "%begdate%" in element.text:
        ...

错误信息:

argument of type 'NoneType' is not iterable

我已将目录硬编码为一个特定的 XML,当我运行 if 语句时,它们工作正常。
当我尝试设置以迭代一系列 XML 时,我遇到了错误。
我搜索了这个网站,看看我是否可以找到解决方案,但所有问题要么与我的不同,要么我不太了解解决方法。

我使用了许多打印行来测试输出。
一切正常,直到我到达 if 语句然后出现错误。

# Location of XML's
folderPath = r"Z:\data"

# set variable to store files with extension ".xml"
for filename in glob.glob(os.path.join(folderPath, "*.xml")):

fullpath = os.path.join(folderPath, filename)

# find files and split the filename from the directory path
if os.path.isfile(fullpath):
    basename, filename2 = os.path.split(fullpath)
    #print "Basename = " + basename
    #print "Filename = " + filename2

    # set variable to store XML structure from xml file
    root = ElementTree(file=r"Z:\data\\" + filename2)


    #Create an iterator
    iter = root.getiterator()
    #Iterate
    for element in iter:
        #print element.text

            if "%begdate%" in element.text:
            BEGDATE = element.text.replace("%begdate%", BEGDATEPARAM)
            element.text = BEGDATE

【问题讨论】:

  • 这不会按书面形式编译 - 我认为您的意思是有问题的行左侧有 4 个空格,与注释掉的 print element.text 对齐。顺便说一句,当您取消注释时,您看到了什么?

标签: python xml loops elementtree


【解决方案1】:

您会发现 xml 文档中有许多元素不包含字符数据(即文本)。关于 python 的好处之一是 None 在条件中是错误的,将其与条件语句短路的知识相结合意味着有一个非常简单的解决方案可以解决您的问题,换行:

if "%begdate%" in element.text:

到:

if element.text and "%begdate%" in element.text:

当没有文本时,element.text 为 None,a.k.a False,然后你甚至不会到达导致错误的条件部分。

【讨论】:

  • +1:更好的是if element.text is not None and "%begdate%" in element.text:
  • 大家好,谢谢大家。这解决了我的问题。我会投票,但显然我在这里没有足够的声誉。感谢大家的快速回复!
【解决方案2】:

您给出的错误表明您正在迭代的标签之一不包含文本。
我认为进行该检查的更好方法是将 if 语句替换为以下之一:

if "%begdate%" == element.text:
    #code goes here...

import re
if re.search("%begdate%", element.text):
    #code goes here...

第一个示例检查是否相等,第二个示例使用regular expression 来查看标记是否包含您的字符串。我不确定正则表达式如何处理None 搜索空间......这可能会失败。

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 2011-10-04
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多