Pythonの組み込みCSVリーダーを使用して検査するために開きたいgzipped CSVファイルがたくさんあります。最初に手動でディスクに解凍せずにこれを実行したいと思います。なんとかして非圧縮データへのストリームを取得し、これをCSVリーダーに渡したいと思います。これはPythonで可能ですか?
gzip
モジュールを使用:
with gzip.open(filename) as f:
reader = csv.reader(f)
#...
上記のバージョンの書き込みと読み取りを試しましたが、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))
より完全なソリューション:
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()
編集:以下のコメントに従って、より簡単なアプローチはどうですか:
def gzipped_csv(filename):
with gzip.open(filename) as f:
r = csv.DictReader(f)
for row in r:
yield row
じゃああなたは
for row in gzipped_csv(filename):
for k, v in row:
print(k, v)