2016-06-08 126 views
1

我正在请求一个经过压缩的csv文件。如何阅读从URL进行Gz压缩的CSV文件 - Python

如何解压该文件并将其转换为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 
+0

使用'gzip'包提取/解压文件。 –

回答

6
import gzip 
import io 

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()) 

而且应该做的伎俩。

+0

我明白了,谢谢。它引发错误瓦特/字节具有第二参数: 文件 “csv_processor.py”,第53行,在 F = io.BytesIO(字节(csv_gz_file, 'UTF-8')) 类型错误:STR( )最多只需要1个参数(给出2个) –

+0

@TimNuwin我正在使用Python3(如果您不知道任何原因,您可能应该这样做) - 您需要定义编码'bytes(str,enc)'它应该使用。在这种情况下,只需从'bytes()'函数中删除','utf-8'。 – Torxed

+0

是的..我不幸运行2.7。这是,如果我删除UTF-8编码参数 回溯(最近通话最后一个)会发生什么: 文件 “csv_processor” 56行,在 csv_content = fh.read() ... 提高IO错误, '不是gzipped文件' IOError:不是gzipped文件 --- 我可以直接从链接下载文件,然后正确解压缩。 –