从 FTP 服务器上的 gz 文件中检索数据而不在本地写入数据
Retrieve data from gz file on FTP server without writing it locally
我想检索存储在 FTP 服务器上的压缩 gz 文件中的数据,而不将该文件写入本地存档。
目前我已经完成了
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
不输出其回调的输出。
有办法吗?
一个简单的实现是:
将文件下载到内存中的类文件对象,如BytesIO
;
将其传递给 GzipFile
constructor 的 fileobj
参数。
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 文件加载到内存中。对于大文件来说效率低下。更智能的实现方式是流式传输数据。但这可能需要实现一个智能的自定义类文件对象。
另见 。
我想检索存储在 FTP 服务器上的压缩 gz 文件中的数据,而不将该文件写入本地存档。
目前我已经完成了
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
不输出其回调的输出。
有办法吗?
一个简单的实现是:
将文件下载到内存中的类文件对象,如
BytesIO
;将其传递给
GzipFile
constructor 的fileobj
参数。
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 文件加载到内存中。对于大文件来说效率低下。更智能的实现方式是流式传输数据。但这可能需要实现一个智能的自定义类文件对象。
另见