Я использую библиотеку 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)