3

我是编程新手,并尝试使用 MNIST 手写数字数据库训练 AI 模型。我已经有一个可以工作的代码,但现在想更深入地研究细节。

在这个项目中,我要做的第一件事是通读 .gz 扩展文件,其中整数以 MBS 优先格式存储。我已通过以下代码成功完成此操作:

[ urllib.request.urlretrieve("http://yann.lecun.com/exdb/mnist/%s.gz" % 文件, "%s.gz" % 文件)

with gzip.open("%s.gz" % file, "rb") as f_in:
    with open("%s" % file, "wb") as f_out:
        shutil.copyfileobj(f_in, f_out)][1]

我检查了 urllib.request.urlretrieve() 的功能描述,上面写着“将 URL 检索到磁盘上的临时位置”。

我想了解是否可以在不创建本地副本的情况下执行相同的任务。是否可以在没有 urlretrieve 的情况下以不同的方式读取在线 .gz 文件?

这不是问题。我只是好奇,想更好地理解它。

4

1 回答 1

2

在开始之前处理文件而不下载整个文件称为“流式传输”。可以流式传输 gzip 压缩文件,因为解码算法通过顺序读取文件来工作。

您可以使用urllib.request.urlopen创建一个流文件对象(如此所示),将其传递给GzipFile而不是gzip.open(),例如:

from urllib.request import urlopen

streamed_file = urlopen(f"http://yann.lecun.com/exdb/mnist/{file}.gz")
with gzip.GzipFile(fileobj=streamed_file) as f_in:
    with open(f"{file}", "wb") as f_out:
        shutil.copyfileobj(f_in, f_out)

注意我正在使用新的字符串格式化方法

我没有测试过这段代码,但这个想法应该可行,因为它们都在“类文件对象”上运行,这基本上意味着它们都实现了io.RawIOBase描述的接口

于 2020-10-02T07:47:10.597 回答