У меня есть куча CSV файлов, которые я хотел бы открыть для проверки, используя Python, встроенный в CSV-ридер. Я бы хотел сделать это, не вставляя их вручную на диск. Думаю, я хочу как-то получить поток к несжатым данным и передать это в CSV-ридер. Возможно ли это в Python?
Использование csvreader для gzipped файла в Python
Ответ 1
Используйте модуль gzip
:
with gzip.open(filename) as f:
reader = csv.reader(f)
#...
Ответ 2
Я пробовал указанную выше версию для записи и чтения, и она не работала в 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))
Ответ 3
более полное решение:
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()