“NoneType”类型的参数不可迭代

时间:2011-07-20 22:13:50

标签: python xml loops elementtree

我正在尝试在一个特定目录中打开一个包含一系列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

2 个答案:

答案 0 :(得分:19)

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

if "%begdate%" in element.text:

为:

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

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

答案 1 :(得分:1)

您提供的错误表明您正在迭代的其中一个标签不包含任何文字 我认为更好的方法是使用以下方法之一替换if语句:

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

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

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