• tarfile.ReadError: not a gzip file


    关于tarfile读取tgz文件报ReadError:not a gzip file的问题分析

    在学习机器学习过程中,需要下载一个房屋数据,按照书上的流程操作下来发现出现以下错误:

    tarfile.ReadError: not a gzip file
    
    • 1

    初始认为是由于tarfile文件调用错误,经过一番查找,发现并非如此。

    分析:

    使用工具下载的数据包大小为139kb,无论是使用urllib.request.urlretrieve还是使用requests.get方法。

    手动下载的数据包大小为400kb

    点击下载地址进行下载。

    错误原因猜测

    通过上面的分析可知,使用工具下载的文件并不完整,虽然从表面看它是一个tgz文件,但是你可以把它理解成一个已经损坏的tgz文件,因此使用tarfile无法正确的进行打开,以至于报tarfile.ReadError: not a gzip file错误。

    解决方案一

    知道的错误原因后,我们可以手动下载对应的tgz文件并放在创建的文件夹下,然后通过程序解压。
    当然这是一个鸡肋的方法,因为你可以直接下载csv文件,然而对于这样的一个问题,我还是过于偏执的下载了tgz文件并通过tarfile进行读取。

    解决方案二

    你也可以在工具下载时对该方法进行一些处理,确保下载的文件正确且完整。

    源代码

    # 下载数据
    import os
    import tarfile
    import urllib.request
    import requests
    
    download_link = "https://github.com/ageron/handson-ml2/tree/master/"
    housing_path = os.path.join("datasets", "housing")
    housing_url = download_link + "datasets/housing/housing.tgz"
    
    
    def download_source(url, output_path):
        response = requests.get(url, stream=False)
        with open(output_path, mode='wb') as f:
            f.write(response.content)
            
    
    def fetch_housing_data(housing_url=housing_url, housing_path=housing_path):
        os.makedirs(housing_path, exist_ok=True)
        tgz_path = os.path.join(housing_path, "housing.tgz")
        if not os.path.exists(tgz_path):
            download_source(housing_url, tgz_path) # 使用requests.get方法
    #         urllib.request.urlretrieve(housing_url, tgz_path) # 使用urllib.request.urlretrieve方法
    
        housing_tgz = tarfile.open(tgz_path, 'r:gz')
        housing_tgz.extractall(path=housing_path)
        housing_tgz.close()
        
    fetch_housing_data()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    【RTS】李宇翔 monibuca 讲座 学习
    leetcode做题笔记141. 环形链表
    Go语言进化之路:泛型的崛起与复用的新篇章
    Apache SeaTunnel本地源码构建编译运行调试
    敏捷开发最佳实践:质量维度实践案例之软硬一体持续交付
    Redis高并发分布式锁详解
    join、inner join、left join、right join的区别
    TIM(4)Encoder_interface
    WebDAV之π-Disk派盘 + 言叶
    Linux中间件之redis存储原理和字典
  • 原文地址:https://blog.csdn.net/a15779627836/article/details/126248048