Аргумент типа 'NoneType' не повторяется - PullRequest
5 голосов
/ 21 июля 2011

Я пытаюсь открыть каталог, содержащий серию 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 ]

19 голосов
/ 21 июля 2011

Вы обнаружите, что в документе xml есть много элементов, которые не содержат символьных данных (то есть текста). Одна из приятных вещей в python - это то, что None не является ложным в условных выражениях, связывая это со знанием того, как условные операторы короткого замыкания означают, что есть действительно простое решение вашей проблемы, измените строку:

if "%begdate%" in element.text:

до:

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

когда нет текста, element.text имеет значение None, a.k.a False, и тогда вы даже не доберетесь до той части условия, которая вызывает ошибку.

1 голос
/ 21 июля 2011

Ошибка, которую вы указали, предполагает, что один из итерируемых тегов не содержит текста.
Я думаю, что лучший способ сделать эту проверку - заменить оператор if одним из следующих:

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

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

В первом примере проверяется равенство, во втором используется регулярное выражение , чтобы проверить, содержит ли тег вашу строку. Я не уверен, как регулярные выражения обрабатывают пространство поиска None ... что может произойти сбой.

...