Получить содержимое из ZIP-файла на SFTP-сервере - PullRequest
0 голосов
/ 18 октября 2019

Я использую библиотеку pysftp для получения содержимого XML с удаленного SFTP-сервера. Недавно произошли изменения в структуре папок, и они представили сжатые папки, потому что они загружают большие файлы (размер сжатой папки варьируется от 700 КБ до 60 МБ). В идеале я хотел бы получить содержимое XML из zip-папки, не загружая его и не сохраняя локально на моем сервере. Более эффективно загрузить файл, а затем проанализировать его? Структура выглядит следующим образом: / root_folder -> zipped_folder -> Несколько папок -> Несколько файлов

Я могу получитьzip-папка, но не удается получить XML-содержимое из нескольких папок внутри zip-папки

with pysftp.Connection(host, username = myUsername, cnopts = cnopts, password=myPassword) as sftp:
    if hostkeys != None:
        print("Connected to new host, caching its hostkey")
        hostkeys.add(host, sftp.remote_server_key.get_name(), sftp.remote_server_key)
        hostkeys.save(pysftp.helpers.known_hosts())

    print("Connection succesfully established ... ")

    # Switch to a remote directory
    sftp.cwd('/root_folder')

    # I read somewhere that I need to use BytesIO
    flo = BytesIO()
    sftp.getfo('zipped_folder.zip', flo)

    zipfile = ZipFile(flo)
    zipfile.namelist()

@ Мартин Прикрыл попросил меня проверить это -

Ну, доберитесь внутреннезвонки getfo. Так что это немного странно. Насколько большой файл? Что если вы сделаете flo = open ('zipped_folder.zip', "wb") вместо flo = BytesIO () (но сохраните sftp.getfo ('zipped_folder.zip', flo)) - это работает?

    flo = open('zipped_folder.zip', "wb") 
    sftp.getfo('zipped_folder.zip', flo)


with ZipFile(flo, "r") as f:
    for info in f.infolist():
        print(info.filename, info.date_time, info.file_size, info.compress_size)

С кодом выше я получаю следующий ответ:

BadZipFile: файл не является zip-файлом

Если я сделаюПосле этого я могу получить список содержимого из zip-папки:

        sftp.get('zipped_folder.zip')  

with ZipFile("zipped_folder.zip", "r") as f:
    for info in f.infolist():
        print(info.filename, info.date_time, info.file_size, info.compress_size)
...