【问题标题】:How to read data from an online gzip file without creating a local copy?如何在不创建本地副本的情况下从在线 gzip 文件中读取数据?
【发布时间】:2021-01-16 22:00:36
【问题描述】:

我是编程新手,并尝试使用 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 文件?

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

【问题讨论】:

  • 请注意,(至少)在 Linux 上,临时文件是指 ram disk;并且文件可能不适合内存(因此无论如何它都会交换)。

标签: python gzip mnist urlretrieve


【解决方案1】:

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

您可以使用urllib.request.urlopen 创建流文件对象(如here 所示),将其传递给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)

注意我使用的是new string formatting method

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

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 2011-02-27
    • 2010-09-19
    • 2017-08-18
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多