【问题标题】:Writing to start of gzip file with python用python写入gzip文件的开头
【发布时间】:2020-08-05 10:18:40
【问题描述】:

写入txt文件的开头可以这样实现:

with open('foo.txt', 'wt') as outfn:
    for i in range(10):
        outfn.write('{}\n'.format(i))

with open('foo.txt', 'r+') as fn:
    content = fn.read()
    fn.seek(0, 0)
    fn.write('foo\n{}'.format(content))

但是,当我尝试写入 gzip 文件的开头时:

import gzip 

with gzip.open('foo.txt.gz', 'wt') as outfn:
    for i in range(10):
        outfn.write('{}\n'.format(i))

with gzip.open('foo.txt.gz', 'r+') as fn:
    content = fn.read()
    fn.seek(0, 0)
    fn.write('foo\n{}'.format(content))

抛出以下错误:

OSError: [Errno 9] write() on read-only GzipFile object

我尝试了多种替代方法,但无法想出一种合适的方式将文本写入 gzip 文件的开头。

【问题讨论】:

    标签: python file gzip


    【解决方案1】:

    我不认为 gzip.open 有一个“+”选项,就像普通文件打开一样。见这里:gzip docs

    您究竟想通过写入文件的开头来做什么?再次打开文件并覆盖它可能更容易。

    【讨论】:

    • 在代码的第一部分,我必须将大量文本写入 gzip 文件。我正在使用一个for循环。然后在第二部分中,我必须将附加到文件的行数写入 gzip 压缩文件的开头。也许你有更好的策略?
    • 如果您还希望压缩行数,那么您可以尝试将其写入单独的文件,然后连接两个文件。类似于this answer.
    • 如果你想在 python 代码中做所有事情,你可能会找到其他答案来做到这一点。这是一个example.
    • 是的,我绝对可以这样做。我只是想知道是否有人有一种优雅的方式可以在上面的代码中直接实现它或类似的方式。不过 +1 为您的思考付出了努力,谢谢!
    【解决方案2】:

    我想出了这个解决方案:

    import gzip 
    
    content = str()
    for i in range(10):
        content += '{}\n'.format(i)
    
    with gzip.open('foo.txt.gz', 'wt') as outfn:
        outfn.write('foo\n{}'.format(content))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多