gpt4 book ai didi

python - 使用 boto3 和回调跟踪 S3 文件的下载进度

转载 作者:太空狗 更新时间:2023-10-29 21:23:37 35 4
gpt4 key购买 nike

我正在尝试使用 boto3 从 S3 下载文本文件。

这是我写的。

class ProgressPercentage(object):
def __init__(self, filename):
self._filename = filename
self._size = float(os.path.getsize(filename))
self._seen_so_far = 0
self._lock = threading.Lock()

def __call__(self, bytes_amount):
# To simplify we'll assume this is hooked up
# to a single filename.
with self._lock:
self._seen_so_far += bytes_amount
percentage = round((self._seen_so_far / self._size) * 100,2)
LoggingFile('{} is the file name. {} out of {} done. The percentage completed is {} %'.format(str(self._filename), str(self._seen_so_far), str(self._size),str(percentage)))
sys.stdout.flush()

我正在调用它

transfer.download_file(BUCKET_NAME,FILE_NAME,'{}{}'.format(LOCAL_PATH_TEMP , FILE_NAME),callback = ProgressPercentage(LOCAL_PATH_TEMP + FILE_NAME))

这给我一个错误,文件不存在于文件夹中。显然,当我在同一个文件夹中已经有一个同名文件时,它可以工作,但是当我下载一个新文件时,它会出错。

我需要做哪些更正?

最佳答案

callback = ProgressPercentage(LOCAL_PATH_TEMP + FILE_NAME)) 创建一个 ProgressPercentage 对象,运行它的 __init__ 方法,并将该对象作为 回调download_file 方法。这意味着 __init__ 方法在 download_file 开始之前运行。

__init__ 方法中,您试图读取正在下载到的本地文件的大小,这会引发异常,因为文件不存在,因为下载尚未开始。如果您已经下载了该文件,则没有问题,因为存在本地副本并且可以读取其大小。

当然,这只是您所看到的异常的原因。您正在使用 _size 属性作为下载进度的最大值。但是,您正在尝试使用本地文件的大小。在文件下载完成之前,本地文件系统不知道文件有多大,它只知道现在占用了多少空间。这意味着当您下载文件时,文件会逐渐变大,直到达到其完整大小。因此,将本地文件的大小视为下载的最大大小并没有多大意义。它可能适用于您已经下载文件的情况,但这不是很有用。

您的问题的解决方案是检查您要下载的文件的大小,而不是检查本地副本的大小。这可确保您获得所下载内容的实际大小,并且该文件存在(因为如果不存在则无法下载)。您可以通过使用 head_object 获取远程文件的大小来完成此操作,如下所示

class ProgressPercentage(object):
def __init__(self, client, bucket, filename):
# ... everything else the same
self._size = client.head_object(Bucket=bucket, Key=filename).ContentLength

# ...

# If you still have the client object you could pass that directly
# instead of transfer._manager._client
progress = ProgressPercentage(transfer._manager._client, BUCKET_NAME, FILE_NAME)
transfer.download_file(..., callback=progress)

最后一点,尽管您从 Boto3 documentation 中获得了代码,它不起作用,因为它用于文件上传。在这种情况下,本地文件是源文件并保证其存在。

关于python - 使用 boto3 和回调跟踪 S3 文件的下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41827963/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com