Использование csvreader против сжатого файла в Python - PullRequest
25 голосов
/ 13 февраля 2012

У меня есть несколько сжатых CSV-файлов, которые я хотел бы открыть для проверки с помощью встроенного в Python ридера CSV.Я хотел бы сделать это без необходимости сначала разархивировать их вручную на диск.Думаю, я хочу каким-то образом получить поток к несжатым данным и передать его в CSV-ридер.Возможно ли это в Python?

Ответы [ 3 ]

30 голосов
/ 13 февраля 2012

Используйте модуль gzip:

with gzip.open(filename) as f:
    reader = csv.reader(f)
    #...
26 голосов
/ 22 декабря 2013

Я пробовал вышеуказанную версию для записи и чтения, и она не работала в 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))
7 голосов
/ 13 января 2013

более полное решение:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...