Использование csvreader против gzipped файла в Python
У меня есть куча gzipped CSV файлов, которые я хотел бы открыть для проверки с помощью встроенного в Python CSV reader. Я хотел бы сделать это без необходимости сначала вручную распаковать их на диск. Я думаю, что хочу каким-то образом получить поток несжатых данных и передать его в CSV-считыватель. Возможно ли это в Python?
3 ответов:
Я пробовал вышеописанную версию для записи и чтения, и она не работала в 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))Как и предполагает амохр, работает также следующее:
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()EDIT: следуя приведенному ниже комментарию, как насчет более простого подхода:
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)
Comments