Получить данные из файла gz на FTP-сервере, не записывая их локально - PullRequest
0 голосов
/ 25 октября 2018

Я хотел бы получить данные из сжатого 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 не выводит вывод своего обратного вызова,Есть ли способ сделать это?

1 Ответ

0 голосов
/ 25 октября 2018

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

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-сервере без загрузки всего архива .

...