当前位置: 首页 > 知识库问答 >
问题:

解压缩下载的。由于UnicodeDecodeError,gz文件失败

桑坚成
2023-03-14

尝试下载. gz文件,将其解压缩到内存中,然后逐行读取解压缩后的内容。

import requests

r = requests.get(url)
print(r.headers)

with gzip.open(r.content, 'rb') as f:
    '''Reading line by line'''

现在,标题如下所示:

{'Date':'Fri,23 Aug2019 07:19:28GMT','Server':'Apache','X-Content-Type-Options':'nosnff','X-Frame-Options':'samesource','Referre-Policy':'no-引用者','X-Xss-Prot':'1','last-Modiated':'Sat,23 Jun2018 09:21:46GMT','ETag':'8be6ca-56f4bad760d07','Accept-Ranges':'bytes','Content-Llong':'9168586','X-Clacks-Overhead':'GNU Terry Pratchett','Cache-Control':'public, max-age=120','Keet-Alive':'timeout=5, max=100','Connection':'Keet-Alive','Content-Type':'Application/x-gzip'}

我得到的错误似乎是一个编码错误,但请求已经在UTF-8和gzip中包含了内容。open()需要UTF-8,因此我没有收到此错误:

UnicodeDecodeError:“utf-8”编解码器无法对位置1中的字节0x8b进行解码:起始字节无效

还有一些类似的问题,对我没有帮助。

共有1个答案

欧阳楚
2023-03-14

根据[Python请求2]:开发人员接口类请求。回答内容(重点是我的):

响应的内容,以字节为单位。

另一方面,[Python 3. Docs]:gzip.open(filename, mode='rb', complslevel=9,编码=无,错误=无,换行符=无):

filename参数可以是实际文件名(str或bytes对象),也可以是要读取或写入的现有文件对象。

要解决此问题,您不应该将r.content传递给gzip.open,而是:

>

  • 用一个io包装它。BytesIO类似对象,并将其传递给gzip.open

    with gzip.open(io.BytesIO(fc)) as f:
        # Your original code (that reads line by line)
    

    将其传递给gzip。解压缩:

    extracted = gzip.decompress(r.content)
    for line in extracted.split(b"\n"):
        # Process each line
        print(line.decode())
    

    或(与上一个项目符号组合)

    with io.BytesIO(gzip.decompress(r.content)) as f:
        # Your original code (that reads line by line)
    

    将其保存到文件中,并将其名称传递给gzip。打开(请注意,这非常慢,可能会引入其他潜在问题,正如@Aran Fey所指出的):

    file_name = "content.gzip"
    with open(file_name, "wb") as f:
        f.write(r.content)
    with gzip.open(r.content, 'rb') as f:
        # Your original code (that reads line by line)
    os.unlink(file_name)
    

  •  类似资料:
    • 问题内容: 我想使用urllib下载文件,并在保存之前对文件进行解压缩。 这就是我现在所拥有的: 最终将写入空文件。我该如何实现自己的追求? 更新的答案: 问题答案: 在写完之后,但要传递给之前,您需要寻找到开始的地方。否则它将被模块从头读取,并显示为空文件。见下文:

    • 问题内容: 这就是问题所在。我有sample.gz文件,大小约为60KB。我想解压缩该文件的前2000个字节。我遇到了CRC检查失败的错误,我猜是因为gzip CRC字段出现在文件末尾,并且它需要整个gzip压缩文件进行解压缩。有办法解决这个问题吗?我不在乎CRC检查。即使由于CRC错误而无法解压缩,也可以。有没有办法解决这个问题并解压缩部分.gz文件? 我到目前为止的代码是 遇到的错误是 还可以

    • 常用压缩包—解压—令整理 Linux 后缀为 .war 格式的文件(一般用在部署 Tomcat 项目的时候) 命令:unzip -oq XXXXXX.war -d ROOT 如果没有 ROOT 目录会自动创建 ROOT 目录。 Linux 后缀为 .tar.gz 格式的文件-解压 命令:tar zxvf XXXXXX.tar.gz Linux 后缀为 .bz2 格式的文件-解压 命令:bzip2

    • 我正在使用Julia的ZipFile包来提取和处理csv文件。没问题,但是当我遇到zip文件中的zip文件时,我也想处理它,但是遇到了一个错误。 Julia ZipFile文档如下:https://zipfilejl.readthedocs.io/en/latest/ 对如何做到这一点有什么想法吗?

    • Kafka producer正在发送.gz文件,但无法在消费者端解压缩和读取文件。获取错误为“IOError:不是gzipped文件” producer-bin/kafka-console-producer.sh--broker-list localhost:9092-topic Airport<~/downloads/stocks.json.gz 消费者- 使用者出错-

    • 本文向大家介绍java多文件压缩下载的解决方法,包括了java多文件压缩下载的解决方法的使用技巧和注意事项,需要的朋友参考一下 Java多文件压缩下载解决方案,供大家参考,具体内容如下 需求: 会员运营平台经过改版后页面增加了许多全部下载链接,上周上线比较仓促,全部下载是一个直接下载ZIP压缩文件的链接,每个ZIP压缩文件都是由公司运营人员将页面需要下载的文件全部压缩成一个ZIP压缩文件,然后通过