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()