如何使用Python从URL读取被Gzip压缩的CSV文件

6

我需要一个被压缩的csv文件。

如何解压该文件并将其转换为csv对象?

csv_gz_file = get("example.com/filename.csv.gz", headers=csv_headers, timeout=30, stream=True)

reader = csv.reader(csv_gz_file)
for row in reader:
   print row

因为它没有解压缩,所以会抛出此错误。

_csv.Error: line contains NULL byte

使用 gzip 包来提取/解压文件。 - HEADLESS_0NE
1个回答

10
import gzip
import io
import requests

web_response = requests.get("example.com/filename.csv.gz", headers=csv_headers,
                            timeout=30, stream=True)
csv_gz_file = web_response.content # Content in bytes from requests.get
                                   # See comments below why this is used.

f = io.BytesIO(csv_gz_file)
with gzip.GzipFile(fileobj=f) as fh:
    # Passing a binary file to csv.reader works in PY2
    reader = csv.reader(fh)
    for row in reader:
        print(row)

通过将gz数据保存在内存中,使用gzip模块提取它,然后将明文数据读入另一个内存容器,最后使用您的读取器打开该容器。

我不太确定csv.reader是希望文件句柄还是数据list,但我认为这应该可以工作。如果不行,就执行以下操作:

reader = csv.reader(csv_content.splitlines())

那应该就可以了。


1
@TimNuwin 很好,假设您解决了最初的问题,我的答案将保持不变。然而,这是完全不同的话题,我建议您查看其他人已经为您解决了那一部分的内容。例如 https://dev59.com/yXVD5IYBdhLWcg3wTZxm 或 https://dev59.com/KmIk5IYBdhLWcg3wFKlK。 - Torxed
1
@TimNuwin 欢迎来到 Python 和 StackOverflow?:) - Torxed
2
确实,这个问题本应该由 OP 进行编辑,因为它没有明确定义 get 来自哪里。我给你的回答打了个踩,因为它仍然混合了字节和文本:当读取时,GzipFile 返回字节,而 StringIO 则期望文本。要么解码字节,要么将 GzipFile 包装在 io.TextIOWrapper 中,在读取时进行解码。 - Ilja Everilä
1
@IljaEverilä 由于csv.reader可以在Python2中处理bytes数据而无需进行类型转换(本质上仍然是字符串),因此我删除了StringIO行。 - Torxed
1
正如@IljaEverilä所建议的那样,我必须使用reader = csv.reader(io.TextIOWrapper(fh,'utf8'))来避免出现“_csv.Error:iterator should return strings,not bytes(did you open the file in text mode?)”错误。 - juniper-
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接