2012-02-12 45 views
20

我有一堆gzip的CSV文件,我想用Python內置的CSV閱讀器打開以供檢查。我想這樣做,而不必先手動將它們解壓縮到磁盤。我想我想以某種方式獲得未壓縮數據的流,並將其傳遞到CSV閱讀器。這在Python中可能嗎?在Python中對gzip文件使用csvreader

+0

在這裏除了原生的Python的解決方案,'pandas'包有['read_csv'](HTTPS ://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)gzip支持的閱讀器 – smci 2018-02-06 23:51:46

回答

26

使用gzip模塊:

with gzip.open(filename) as f: 
    reader = csv.reader(f) 
    #... 
+0

如果'filename ='tzaman.csv',那麼它會生成文件'tzaman.csv',這是一個歸檔文件,並且包含另一個文件'tzaman.csv',它實際上是一個csv文件。如果我們將它命名爲'abc.zip',那麼它會添加一個zip文件'abc.zip'並且包含一個文件'abc.zip',它實際上是一個csv文件。該怎麼辦? – Clayton 2014-06-04 09:44:36

+0

它不壓縮文件嗎? – Clayton 2014-06-04 09:57:08

+1

它不創建存檔。 Gzip只是一個流式壓縮器。文件名應該被稱爲'tzsman.csv.gz'來幫助識別文件類型。另外,gzip庫不支持Python 2.6.8中的with語句。 – Doug 2014-07-28 02:23:21

6

一個更完整的解決方案:

import csv, gzip 
class GZipCSVReader: 
    def __init__(self, filename): 
     self.gzfile = gzip.open(filename) 
     self.reader = csv.DictReader(self.gzfile) 
    def next(self): 
     return self.reader.next() 
    def close(self): 
     self.gzfile.close() 
    def __iter__(self): 
     return self.reader.__iter__() 

現在你可以使用它像這樣:

r = GZipCSVReader('my.csv') 
for map in r: 
    for k,v in map: 
     print k,v 
r.close() 
+0

整潔。如果你可以添加'__enter _/__ exit __()'上下文管理器方法,所以它可以和'with'語句一起使用。 – smci 2018-02-06 23:11:07

19

我已經試過以上版本用於寫入和閱讀,並且由於「字節」錯誤,它在Python 3.3中不起作用。但是,經過一些試驗和錯誤,我可以得到以下工作。也許這也幫助他人:

import csv 
import gzip 
import io 


with gzip.open("test.gz", "w") as file: 
    writer = csv.writer(io.TextIOWrapper(file, newline="", write_through=True)) 
    writer.writerow([1, 2, 3]) 
    writer.writerow([4, 5, 6]) 

with gzip.open("test.gz", "r") as file: 
    reader = csv.reader(io.TextIOWrapper(file, newline="")) 
    print(list(reader)) 

由於amohr建議,以下的作品,以及:

import gzip, csv 

with gzip.open("test.gz", "wt", newline="") as file: 
    writer = csv.writer(file) 
    writer.writerow([1, 2, 3]) 
    writer.writerow([4, 5, 6]) 

with gzip.open("test.gz", "rt", newline="") as file: 
    reader = csv.reader(file) 
    print(list(reader)) 
+0

@Gerenuk它就像一個魅力! – ZuLu 2015-01-02 18:08:35

+0

這個解決方案也可以用'io.BufferedReader',根據一些[基準](http://ebnj.net/pythongzipbenchmarks/)可能會更快。簡單地用'io.BufferedReader'將'gzip.open'封裝爲'使用io.BufferedReader(gzip.open(「test.gz」,'r'))作爲文件:' – 2015-05-05 20:18:36

+2

如果您使用的話,您可以跳過TextIOWrapper/BufferedReader gzip.open(mode ='rt' – amohr 2016-01-23 00:31:19