我有许多经过gzip压缩的CSV文件,我想使用Python内置的CSV读取器打开并检查它们。我想在不必手动将它们解压到磁盘上的情况下完成此操作。我猜我想要以某种方式获取未压缩数据的流,并将其传递给CSV读取器。在Python中是否有可能实现这一点?
使用gzip
模块:
with gzip.open(filename, mode='rt') as f:
reader = csv.reader(f)
#...
gzip.open
调用中指定文件模式。 - tzamanopen
调用中指定模式。我已经编辑了答案以在文本模式下打开,这应该可以解决错误。 - tzaman我已经尝试了上述版本进行编写和阅读,但在Python 3.3中由于“bytes”错误而无法使用。然而,在一些尝试和错误之后,我能够使以下内容正常工作。也许这对其他人有所帮助:
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))
io.BufferedReader
,根据一些基准测试可能会更快。只需使用 io.BufferedReader
包装 gzip.open
,使其变为 with io.BufferedReader(gzip.open("test.gz", 'r')) as file:
。 - Niklas Bcsv.reader
,它有很多选项可以自定义格式 https://docs.python.org/3.6/library/csv.html#csv-fmt-params - Gereimport 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)
__enter__/__exit__()
上下文管理器方法,那就更整洁了,这样它就可以与with
语句一起使用。 - smci
pandas
包还提供了具有gzip支持的read_csv
读取器。 - smci