【发布时间】:2021-09-15 17:16:19
【问题描述】:
我需要修改一个 gzip 格式的制表符分隔文件。我可以从输入读取并将修改后的读取写入输出文件:
output = tempfile.NamedTemporaryFile(mode="w", delete=False)
with gzip.open(input, "rb") as in_file,\
gzip.open(output, "wb") as out_file:
for l in in_file:
split_line = l.split("\t")
if split_line[0] == "hello":
split_line[0] = "hi"
out_file.write("\t".join(split_line))
我使用的 gzip 压缩文件的大小为 100 GB,因此仅将整个文件重写为不同的文件以修改子集并不理想。因此,我对修改文件就地(即,在您遍历原始文件时修改原始文件)的解决方案感兴趣。
【问题讨论】:
-
gzip 压缩格式不允许就地修改。
-
真的不可能。它是一种流压缩算法,因此如果您更改文件中的某些内容,那么它之后的所有内容都会受到影响。
-
您可能是时候为您的数据考虑一种不同的格式了。也许是 SQLite,或者甚至是其中一个 SQL 服务器。
-
我的意思是,如果您有意构建您的 gzip 文件以使压缩表每隔一段时间重置一次,然后在新内容大于旧内容时使用填充,它是 理论上可以实现,但理论上可以!=实用。
-
(请注意,一些较新的文件系统允许您在块边界的中间扩展文件,因此如果您将定期压缩表重置与该功能相结合,您甚至可以在文件中间添加新数据当它更大时,但您仍然需要处理使所有内容正确对齐在插入块之后......这一切都取决于一个足够现代的文件系统)。