Откройте zip-файл и выполните потоковую передачу xml-файла внутри zip-файла. - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь открыть массовые данные из USPTO .XML-файлы в zip-файлах являются сцепленными xml-файлами, содержащими несколько объявлений xml, и имеют большой размер.Я пытаюсь читать только строки из XML, пока не доберусь до следующего объявления XML.Я нашел этот связанный вопрос, без кода.

Я хочу создать функцию, которая выполняет следующие действия:

  1. Для каждого * .zip файла
  2. Извлечь все XML-файл (ы) (или открыть XML-файл (ы) для чтения)
  3. Считать строки из XML-файла (ов)
  4. Добавить каждую строку до следующейОбъявление xml
  5. Возвращает строку

До сих пор я был в состоянии открыть zip-файл, найти все xml-файлы и извлечь каждый xml-файл.Я бы предпочел не записывать XML-файл на диск, а вместо этого создать строку, представляющую собой один XML-документ, который я затем буду анализировать.

def main():
path = 'bulk/'
allFiles = glob.glob(path + '*.zip')
allFiles.sort()

for file in allFiles:
    try:
        with zipfile.ZipFile(file, mode = 'r', allowZip64 = True) as fin:
            print(fin, '- ok')
            print(fin.namelist())
            for name in fin.namelist():
                if name.endswith('xml'):
                    print(name) # all files that end in 'xml'
                    fin.extract(name, path='bulk/')
                    print('extracted ', name)
                    # TODO function to read lines of the xml file and




    except zipfile.BadZipFile:
            print(file,'- Bad zip file')

if __name__ == '__main__': main()

1 Ответ

0 голосов
/ 04 января 2019

Используйте read вместо extract.Возвращает байты файла в zip-файле с указанным именем.Важно понимать, что вы, по сути, извлекаете архив в память, поэтому имейте в виду, сколько данных на самом деле будет извлечено, и ваши ограничения в этом отношении.

Например, следующая функция возвращает dictс именами файлов zip-архива в качестве ключей и содержимым файлов в качестве значений:

from zipfile import ZipFile

def extract(f):
    zf = ZipFile(f)
    return {name: zf.read(name) for name in zf.namelist()}
...