парсинг больших сжатых XML-файлов, python - PullRequest
2 голосов
/ 04 декабря 2009
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

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

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

Ответы [ 3 ]

5 голосов
/ 04 декабря 2009

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

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

Ссылка: http://docs.python.org/library/pyexpat.html#xml.parsers.expat.xmlparser.ParseFile

1 голос
/ 04 декабря 2009

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

file  = BZ2File(SOME_FILE_PATH)
p = xml.parsers.expat.ParserCreate()
p.Parse(file.read())
0 голосов
/ 04 декабря 2009

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

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

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

...