Python: 如何在将文件上传到 SFTP 时即时压缩文件?
Python: How to zip a file on the fly while uploading it to SFTP?
如何在即时压缩文件的同时将文件上传到 SFTP 服务器。
或者换句话说,如何将本地文件压缩并同时上传到SFTP服务器。
我找到了一个使用 GzipFile writer 的解决方案,并为它提供了文件对象,我将其用作间谍来获取数据,而无需实际写入文件。
然后我将它的结果直接放入一个队列中,该队列是我在其他线程上构建的。
长话短说这是代码
用法
sftp.putfo(ReaderMaker(unzipped_file_path), remote_path)
实施
COMPRESS_LEVEL = 9
BUFF_SIZE = 1024 * 1024
class ReaderMaker:
def __init__(self, inputFile):
self.it = self.compressor(inputFile)
self.queue = Queue.Queue(10)
task = Thread(target=self.zipper)
task.start()
def zipper(self):
while True:
try:
data = self.it.next()
while len(data) == 0:
data = self.it.next()
self.queue.put(data)
except StopIteration:
break
self.queue.put('') # this will notify the last item read
def read(self, n):
return self.queue.get()
def compressor(self, inputFile):
class Spy:
def __init__(self):
self.data = ''
def write(self, d):
self.data = self.data + d
def flush(self):
d = self.data
self.data = ''
return d
f_in = open(inputFile, 'rb')
spy = Spy()
f_out = GzipFile('dummy.gz', 'wrb+', COMPRESS_LEVEL, spy)
while True:
data = f_in.read(BUFF_SIZE)
if len(data) == 0:
break
f_out.write(data)
yield spy.flush()
f_out.close()
f_in.close()
yield spy.flush()
如何在即时压缩文件的同时将文件上传到 SFTP 服务器。
或者换句话说,如何将本地文件压缩并同时上传到SFTP服务器。
我找到了一个使用 GzipFile writer 的解决方案,并为它提供了文件对象,我将其用作间谍来获取数据,而无需实际写入文件。
然后我将它的结果直接放入一个队列中,该队列是我在其他线程上构建的。
长话短说这是代码
用法
sftp.putfo(ReaderMaker(unzipped_file_path), remote_path)
实施
COMPRESS_LEVEL = 9
BUFF_SIZE = 1024 * 1024
class ReaderMaker:
def __init__(self, inputFile):
self.it = self.compressor(inputFile)
self.queue = Queue.Queue(10)
task = Thread(target=self.zipper)
task.start()
def zipper(self):
while True:
try:
data = self.it.next()
while len(data) == 0:
data = self.it.next()
self.queue.put(data)
except StopIteration:
break
self.queue.put('') # this will notify the last item read
def read(self, n):
return self.queue.get()
def compressor(self, inputFile):
class Spy:
def __init__(self):
self.data = ''
def write(self, d):
self.data = self.data + d
def flush(self):
d = self.data
self.data = ''
return d
f_in = open(inputFile, 'rb')
spy = Spy()
f_out = GzipFile('dummy.gz', 'wrb+', COMPRESS_LEVEL, spy)
while True:
data = f_in.read(BUFF_SIZE)
if len(data) == 0:
break
f_out.write(data)
yield spy.flush()
f_out.close()
f_in.close()
yield spy.flush()