Парсинг больших сжатых xml файлов, python

file  = BZ2File(SOME_FILE_PATH)
p = xml.parsers.expat.ParserCreate()
p.Parse(file)

Вот код, который пытается проанализировать XML-файл, сжатый с помощью bz2. К сожалению, это не удается с сообщением:

TypeError: Parse() argument 1 must be string or read-only buffer, not bz2.BZ2File

Есть ли способ на лету разобрать сжатые xml-файлы bz2?

Примечание: p.Parse(file.read()) это не вариант здесь. Я хочу проанализировать файл, который больше, чем доступная память, поэтому мне нужен поток.

3 ответа

Решение

Просто используйте p.ParseFile(файл) вместо p.Parse (файл).

Parse () принимает строку, ParseFile() принимает дескриптор файла и считывает данные по мере необходимости.

Ссылка: http://docs.python.org/library/pyexpat.html

Использование .read()на file объект для чтения во всем файле в виде строки, а затем передать его Parse?

file  = BZ2File(SOME_FILE_PATH)
p = xml.parsers.expat.ParserCreate()
p.Parse(file.read())

Можете ли вы передать файл mmap()? Это должно обеспечить автоматическое разбиение на страницы необходимых частей файла и избежать переполнения памяти. Конечно, если expat создает дерево разбора, оно может все еще не хватать памяти.

http://docs.python.org/library/mmap.html

Файловые объекты с отображением в памяти ведут себя как строки и как файловые объекты. Однако, в отличие от обычных строковых объектов, они изменчивы. Вы можете использовать объекты mmap в большинстве мест, где ожидаются строки; например, вы можете использовать модуль re для поиска в отображенном в памяти файле.

Другие вопросы по тегам