【问题标题】:why `write_through=True` is necessary when write a zipped csv?为什么在编写压缩 csv 时需要 `write_through=True`?
【发布时间】:2017-06-09 15:24:47
【问题描述】:

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() 缓冲:写入 TextIOWrapper 对象的任何数据都会立即 处理到它的底层二进制缓冲区。

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

这里为什么只支持write_through=True

Python 版本:3.5

【问题讨论】:

    标签: python-3.x csv


    【解决方案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
    

    【讨论】:

    • csv_w = csv.writer(f) 也不起作用。我认为这与 python 3 有关。
    • 我知道它希望使用 newline='' 参数集打开文件 - 您可以检查 docs.python.org/3/library/csv.html。尝试将其添加到 gzip.open 语句中?我现在不在 Python 机器上,所以我无法测试,但我很好奇。
    • 这适用于 gzip.open('test2.csv.gz', 'wt', newline='') as f: csv_w = csv.writer(f) # ok 基本上,写成文本,它添加了一个自动换行符。如果内存对我有用,它会自动刷新缓冲区。
    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多