Читайте огромный XML внутри архива 7z - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь прочитать XML внутри дампов данных stackoverflow, но обнаружил, что это не так просто.Идея состоит в том, чтобы прочитать каждый тег и извлечь что-то.Я не нашел способ прочитать файл на лету.Вот мой код (archive_path - это файл 7z, содержащий имя файла)

import py7zlib
from xml.etree.cElementTree import iterparse

def test(archive_path,filename):
    with open(archive_path,'rb') as fp:
        archive = py7zlib.Archive7z(fp)
        context = iterparse(archive.getmember(filename), events=("start", "end"))
        context = iter(context)
        event, root = next(context)
        for event, elem in context:
            if event == "end" and elem.tag == "row":
                import code; code.interact(local=locals())
                root.clear()

(обратите внимание на код импорта, который я использую для отладки) Вот ссылка на случайный небольшой дамп стека обмена https://archive.org/download/stackexchange/webmasters.meta.stackexchange.com.7z

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что iterparse, кажется, не работает (python3), и файл, кажется, не читается правильно (его можно прочитать на лету?).

Редактировать: код как онтеперь дает исключение для следующего (content)

 File "stack.py", line 25, in readRows
   event, root = next(context) #context.__next__()
 File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 1223, in iterator
   data = source.read(16 * 1024)
TypeError: read() takes 1 positional argument but 2 were given

Ошибка, вероятно, из-за файлов py7zlib, которые имеют только read (), который читает полный файл

...