簡體   English   中英

如何從迭代器創建 Python 文件,如 Object

[英]How To Create a Python file-like Object from an Iterator

我正在使用來自boto3客戶端的upload_fileobj function 作業測試從 python glue shell 作業寫入S3的吞吐量。 這個 function 的輸入是

Fileobj(類文件對象)——要上傳的類文件 object。 至少,它必須實現 read 方法,並且必須返回字節。

為了讓測試僅隔離吞吐量,而不是 memory 或 CPU 功能,我認為使用 upload_file_object 的最佳方法是傳遞一個iterator ,該迭代器產生N個字節的值0

在 python 中,如何從迭代器創建“類文件對象”?

我正在尋找某種形式的東西

from itertools import repeat

number_of_bytes = 1024 * 1024

zero_iterator = repeat(b'0', number_of_bytes)

file_like_object = something(zero_iterator) # fill in 'something'

然后將其傳遞給 boto3 進行編寫

session.client('s3').upload_fileobj(file_like_object, Bucket='my_bucket')

預先感謝您的考慮和回復。

這是https://stackoverflow.com/a/70547492/1319998答案的簡化版本,因為我們只需要處理bytes ,因此應該適合 boto3 的upload_fileobj

def to_file_like_obj(iterable):
    chunk = b''
    offset = 0
    it = iter(iterable)

    def up_to_iter(size):
        nonlocal chunk, offset

        while size:
            if offset == len(chunk):
                try:
                    chunk = next(it)
                except StopIteration:
                    break
                else:
                    offset = 0
            to_yield = min(size, len(chunk) - offset)
            offset = offset + to_yield
            size -= to_yield
            yield chunk[offset - to_yield:offset]

    class FileLikeObj:
        def read(self, size=-1):
            return b''.join(up_to_iter(float('inf') if size is None or size < 0 else size))

    return FileLikeObj()

如果你有一個產生字節的迭代, my_iterable說,這可以與 boto3 一起使用,如下所示:

target_obj = boto3.Session().resource('s3').Bucket('my-target-bucket').Object('my/target/key')
target_obj.upload_fileobj(to_file_like_obj(my_iterable)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM