Оказывается, проблема связана со сжатым файлом 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). Вы можете посмотреть на это!