2012-02-12 11 views
20

Pythonに組み込まれたCSVリーダーを使用して閲覧するために開いているgzipped CSVファイルがあります。私は手動でそれらをディスクに最初に解凍することなくこれをしたいと思います。私は何とか非圧縮データにストリームを取得し、これをCSVリーダーに渡したいと思います。これはPythonで可能ですか?Pythonのgzippedファイルに対するcsvreaderの使用

+0

、 'pandas'パッケージは[' read_csv'](HTTPSを持っています://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)gzipをサポートしているリーダー – smci

答えて

26

gzipモジュールを使用します

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

'filename = 'tzaman.csv''の場合、ファイル' tzaman.csv'はアーカイブファイルであり、実際にはcsvファイルである別のファイル 'tzaman.csv'を含んでいます。 'abc.zip'という名前を付けると、zipである' abc.zip'が追加され、実際にはcsvというファイル 'abc.zip'が追加されます。何をすべきか? – Clayton

+0

ファイルを圧縮しませんか? – Clayton

+1

アーカイブを作成しません。 Gzipはストリームコンプレッサーだけです。ファイルの種類を特定するには、ファイル名を 'tzsman.csv.gz'とする必要があります。また、gzipライブラリはPython 2.6.8のwith文をサポートしていません。 – Doug

6

より完全なソリューション:私は上記のバージョンを試してみた

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

Neat。あなたが '__enter _/__ exit __()'コンテキストマネージャメソッドを追加できれば、それを 'with'ステートメントと共に使用できるようにします。 – smci

19

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

今、あなたはこのようにそれを使用することができますがPython 3.3では "bytes"エラーのために読み書きができませんでした。しかし、いくつかの試行錯誤の後、私は以下のことを働かせることができました。 amohrが示唆するように、次の作品だけでなく、

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

::たぶん、それはまた、他の人を助け、ここでネイティブのPythonのソリューションに加えて

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

+0

このソリューションは、いくつかの[ベンチマーク](http://ebnj.net/pythongzipbenchmarks/)に従って速いかもしれない 'io.BufferedReader'でも動作します。 'gzip.open'を' io.BufferedReader'で包み、 'io.BufferedReader(gzip.open(" test.gz "、 'r'))をファイルとして' –

+2

とするだけで、使用するならTextIOWrapper/BufferedReaderをスキップすることができますgzip.open(mode = 'rt' – amohr

関連する問題