Проблемы с ElementTree - PullRequest
       7

Проблемы с ElementTree

0 голосов
/ 03 января 2019

У меня есть следующий XML-файл (который содержит данные о более чем 2 ГБ):

<events version="1.0">
    <event time="10998.0" type="actend" person="1" link="link36" actType="home"  />
    <event time="10998.0" type="departure" person="1" link="link36" legMode="car"  />
    <event time="10998.0" type="PersonEntersVehicle" person="1" vehicle="1"  />
....
</events>

А для чтения и анализа данных я стараюсь использовать такой подход: http://boscoh.com/programming/reading-xml-serially.html

Но когда я пробую вещь с пространством имен:

nsmap = {}
for event, elem in etree.iterparse(xmL, events=('start-ns')):
  ns, url = elem
  nsmap[ns] = url
print(nsmap)

Произошла ошибка:

Traceback (most recent call last):

  File "<ipython-input-16-6baf583a11d5>", line 1, in <module>
    runfile('C:/Codezeug/Pypy/01/PlayingAround.py', wdir='C:/Codezeug/Pypy/01')

  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
    execfile(filename, namespace)

  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Codezeug/Pypy/01/PlayingAround.py", line 22, in <module>
    for event, elem in etree.iterparse(one, events=('start-ns')):

  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\xml\etree\ElementTree.py", line 1218, in iterparse
    pullparser = XMLPullParser(events=events, _parser=parser)

  File "C:\Users\AppData\Local\Continuum\anaconda3\lib\xml\etree\ElementTree.py", line 1261, in __init__
    self._parser._setevents(self._events_queue, events)

ValueError: unknown event 's'

Как работает этот код и почему он ищет 's'?

1 Ответ

0 голосов
/ 03 января 2019

Вам необходимо предоставить кортеж для

for event, elem in etree.iterparse(xmL, events=('start-ns',)): # added , to make it a tuple

иначе он будет интерпретировать строку как итеративную и пробовать каждый символ отдельно.


Ваш XML не содержит пространств имен:

t = """<events version="1.0">
    <event time="10998.0" type="actend" person="1" link="link36" actType="home"  />
    <event time="10998.0" type="departure" person="1" link="link36" legMode="car"  />
    <event time="10998.0" type="PersonEntersVehicle" person="1" vehicle="1"  />
</events>"""

with open("data.xml","w") as f: f.write(t)

import xml.etree.ElementTree as etree
with open("data.xml") as f:
    for event, elem in etree.iterparse(f, events=('start-ns', )):
        print (event, elem)

работает, но ничего не печатает - измените xml на файл с пространством имен, чтобы получить вывод:

t = """<events version="1.0" xmlns:k="some_namespace">
    <event time="10998.0" type="actend" person="1" link="link36" actType="home"  />
    <event time="10998.0" type="departure" person="1" link="link36" legMode="car"  />
    <event time="10998.0" type="PersonEntersVehicle" person="1" vehicle="1"  />
</events>"""

Выходы:

start-ns ('k', 'some_namespace')
...