Получение данных из файла gz на FTP-сервере без их локальной записи

Я хотел бы получить данные внутри сжатого файла gz, хранящегося на FTP-сервере, без записи файла в локальный архив.

На данный момент я сделал

from ftplib import FTP
import gzip

ftp = FTP('ftp.server.com')
ftp.login()  
ftp.cwd('/a/folder/')

fileName = 'aFile.gz'

localfile = open(fileName,'wb')
ftp.retrbinary('RETR '+fileName, localfile.write, 1024)

f = gzip.open(localfile,'rb')
data = f.read()

Это, однако, записывает файл "localfile" в текущее хранилище.

Я пытался изменить это в

from ftplib import FTP
import zlib

ftp = FTP('ftp.server.com')
ftp.login()  
ftp.cwd('/a/folder/')

fileName = 'aFile.gz'

data = ftp.retrbinary('RETR '+fileName, zlib.decompress, 1024)

но ftp.retrbinary не выводит результат своего обратного вызова. Есть ли способ сделать это?


person Luca    schedule 25.10.2018    source источник


Ответы (1)


Простая реализация:

import gzip
from io import BytesIO
import shutil
from ftplib import FTP

ftp = FTP('ftp.example.com')
ftp.login('username', 'password')

flo = BytesIO()

ftp.retrbinary('RETR /remote/path/archive.tar.gz', flo.write)

flo.seek(0)

with open('archive.tar', 'wb') as fout, gzip.GzipFile(fileobj = flo) as gzip:
    shutil.copyfileobj(gzip, fout)

Приведенное выше загружает в память весь файл .gz. Что может быть неэффективным для больших файлов. Вместо этого более разумная реализация могла бы передавать данные в потоковом режиме. Но для этого, вероятно, потребуется реализовать интеллектуальный настраиваемый файловый объект.

См. Также Получение имен файлов внутри zip-файла на FTP-сервере без загрузки всего архива.

person Martin Prikryl    schedule 25.10.2018