如何解决使用 DataLakeFileClient 和进度条下载文件
我需要使用 DataLakeFileClient 从 Azure 下载一个大文件,并在下载过程中显示一个类似 tqdm 的进度条。下面是我用较小的测试文件尝试的代码。
# Download a File
test_file = DataLakeFileClient.from_connection_string(my_conn_str,file_system_name=fs_name,file_path="161263.tmp")
download = test_file.download_file()
blocks = download.chunks()
print(f"File Size = {download.size},Number of blocks = {len(blocks)}")
with open("./newfile.tmp","wb") as my_file:
for block in tqdm(blocks):
my_file.write(block)
结果在 jupyter notebook 中显示如下,块数与文件大小相同。
如何使块数正确且进度条正常工作?
解决方法
在使用chucks的时候要注意只有文件大小大于32MB
(33554432 bytes
),那么文件大小(这里的文件大小是指total file size - 32MB
)才会将每个块分成 4MB
个大小的块。
例如,如果文件大小为 39MB,它将被拆分为 3 个块。第一个块是 32MB,第二个块是 4MB,第三个块是 3MB(39MB - 32MB - 4MB
)。
这是一个例子,它可以很好地在我身边工作:
from tqdm import tqdm
from azure.storage.filedatalake import DataLakeFileClient
import math
conn_str = "xxxxxxxx"
file_system_name="xxxx"
file_name="ccc.txt"
test_file = DataLakeFileClient.from_connection_string(conn_str,file_system_name,file_name)
download = test_file.download_file()
blocks = download.chunks()
number_of_blocks = 0
#if the file size is larger than 32MB
if len(blocks) > 33554432:
number_of_blocks = math.ceil((len(blocks) - 33554432) / 1024 / 1024 / 4) + 1
else:
number_of_blocks = 1
print(f"File Size = {download.size},Number of blocks = {number_of_blocks}")
#initialize a tqdm instance
progress_bar = tqdm(total=download.size,unit='iB',unit_scale=True)
with open("D:\\a11\\ccc.txt","wb") as my_file:
for block in blocks:
#update the progress bar
progress_bar.update(len(block))
my_file.write(block)
progress_bar.close()
print("**completed**")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。