写一个压缩的csv时为什么需要`write_through = True`?

时间:2017-06-08 14:43:49

标签: python-3.x csv

Using csvreader against a gzipped file in Python

with gzip.open('test2.csv.gz', 'w') as f:
    #csv_w = csv.writer(io.TextIOWrapper(f, write_through=False)) # write empty csv.gz file
    csv_w = csv.writer(io.TextIOWrapper(f, write_through=True)) # ok
    csv_w.writerow(['a', 'b', 'c'])
    csv_w.writerow([1,2,3])
    csv_w.writerow([4,5,6])

https://docs.python.org/3/library/io.html

  

如果write_through为True,则保证不会调用write()   buffered:立即在TextIOWrapper对象上写入的任何数据   处理到它的底层二进制缓冲区。

问题>我想缓冲写入并设置write_through=False。但是,它将生成空的csv.gz文件。但是,如果我切换到write_through=True,它就可以工作。

此处仅支持write_through=True的任何原因?

Python版本:3.5

1 个答案:

答案 0 :(得分:1)

为了压缩文件,GZ必须在文件中找到模式。 GZ使用的压缩公式分析了有问题的文件,如果它不存在,它就不会从我所知道的内容中输出任何内容。您可以阅读有关DEFLATE如何工作的更多信息here

设置" write_through"标志为True,它将缓冲区刷新到磁盘,从那里GZ可以读取它。如果你不这样做,那么CSV编写器会将信息保存在gzip无法访问的本地缓冲区中。

我希望有所帮助。

如果要直接写入文件,可以执行以下操作,无需io缓冲区。

gzip.open('test2.csv.gz', 'wt', newline='') as f: 
  csv_w = csv.writer(f) # ok