Парсинг больших сжатых 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() принимает дескриптор файла и считывает данные по мере необходимости.
Использование .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 для поиска в отображенном в памяти файле.