2016-06-08 167 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文件 --- 我可以直接從鏈接下載文件,然後正確解壓縮。 –