преобразование XML-файла bz2 в json в python [duplicate]

Я не сталкивался с визуальным отладчиком, но bashdb работает достаточно хорошо для отладки. Вы можете установить точки останова, продолжить, распечатать переменные и т. Д.

https://sourceforge.net/projects/bashdb/

Установить через репозитории вашего дистрибутива , Ниже приведено краткое руководство: http://www.rodericksmith.plus.com/outlines/manuals/bashdbOutline.html (первая глава занимает всего полчаса, чтобы прочитать / попробовать).

8
задан scities 1 April 2015 в 22:26
поделиться

2 ответа

Оказывается, проблема связана со сжатым файлом planet.osm.

Как указано в OSM Wiki , файл планеты сжимается как многопоточный файл, а модуль python bz2 не может читать многопоточные файлы. Однако документация bz2 указывает на альтернативный модуль, который может читать такие файлы, bz2file . Я использовал его, и он отлично работает!

Итак, код должен читаться:

from lxml import etree as et
from bz2file import BZ2File

path = "where/my/fileis.osm.bz2"
with BZ2File(path) as xml_file:
    parser = et.iterparse(xml_file, events=('end',))
    for events, elem in parser:

        if elem.tag == "tag":
            continue
        if elem.tag == "node":
            (do something)


    ## Do some cleaning
    # Get rid of that element
    elem.clear()

    # Also eliminate now-empty references from the root node to node        
    while elem.getprevious() is not None:
        del elem.getparent()[0]

Кроме того, проведя некоторое исследование использования формата PBF (как указано в комментариях), я наткнулся на implm.parser , модуль python, который реализует общий синтаксический анализатор для данных OSM (в формате pbf или xml). Вы можете посмотреть на это!

5
ответ дан scities 16 August 2018 в 14:20
поделиться

В качестве альтернативы вы можете использовать вывод команды bzcat (который также может обрабатывать многопоточные файлы):

p = subprocess.Popen(["bzcat", "data.bz2"], stdout=subprocess.PIPE)
parser = et.iterparse(p.stdout, ...)
# at the end just check that p.returncode == 0 so there were no errors
2
ответ дан Messa 16 August 2018 в 14:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: