在包含换行符的文件上使用gzip时出现错误

3

我正在尝试使用Python的gzip库来简化一些创建CSV输出文件的Python脚本。我尝试了许多不同的方法来创建gzip文件,但无论我尝试哪种方法,我都遇到了同样的问题。

我的Python脚本成功运行,但是当我尝试在Finder(使用macOS 10.15.6)中解压缩gzip文件时,我会收到以下错误提示:

Unable to expand "file.csv.gz" into "Documents". (Error 79 - Inappropriate file type or format.)

经过一番调试,我已经缩小了错误的原因,那就是文件内容中包含了换行符(\n)字符。
这个简单的示例代码会在gzip扩展时触发上述错误:
import gzip

content = b'Id,Food\n1,Spam\n2,Eggs\n'
f = gzip.open('file.csv.gz', 'wb')
f.write(content)
f.close()

如果我从content变量中删除所有的\n字符,一切都可以正常工作:

import gzip

content = b'Id,Food,1,Spam,2,Eggs'
f = gzip.open('file.csv.gz', 'wb')
f.write(content)
f.close()

gzip是否要求我使用不同的换行机制?我确定我缺乏有关gzip或二进制文件的某些基础知识,因此任何有助于让我重新回到正轨的信息都将不胜感激。


1
我无法在Linux上使用Python 3.8.5、3.7.7、3.6.8或3.5.4重现此问题。gzip -cd <file.csv.gz对于带有或不带有\ncontent都可以成功执行。 - pts
1
也许问题出在 MacOS 处理 gzip 内容的方式上。我正在使用 Python 3.8.2。我也没有收到 Python 错误。只有当我尝试在 Finder 中解压文件时才会出现问题。 - Daniel Long
1
也有可能发生您的 Mac 上的 gzip.py 有缺陷,从而生成损坏的 .gz 文件。您可以分享生成的 file.csv.gz,以便我们检查它是否正确。您还可以尝试在 macOS 或 Linux 上使用 gzip -cd <... 进行解压缩。 - pts
1
当我运行 gzip -cd <file.csv.gz 时,它可以很好地解压缩。输出为:Id,Food\n1,Spam\n2,Eggs\n。也许这是一个 MacOS 的错误。 - Daniel Long
2个回答

4

这与Python的gzip无关。可以说,这是macOS的一个bug,它有时会将解压后的未压缩数据检测为Archive Utility的mtree格式,但发现未压缩数据不符合mtree格式。

解决方法是不要双击进行解压缩,使用gzip进行解压缩。


只是为了确认,使用gzip进行解压的最佳方式是通过终端命令,对吗?gzip -d file.csv.gz - Daniel Long
1
出于好奇 - 你知道有什么替代方案吗?如果我不必向团队中的非技术利益相关者解释bash基础知识,那就太好了,但如果需要的话我可以这样做。 - Daniel Long
@DanielLong 正确。或者 gunzip file.csv.gz - Mark Adler
1
@DanielLong 你可以使用The Unarchiver。在Finder中,你可以将其设置为默认打开方式,而不是Archive Utility。 - Mark Adler

0

CSV的一个解决方法是在数据中包含空格,例如:

import gzip

content = b'Id,Food\n1,Spam\n2,Green Eggs and Ham\n'
f = gzip.open('file.csv.gz', 'wb')
f.write(content)
f.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接