在 python 中提取 gzip 文件时查找原始文件名

Finding the original filename when extracting gzip files in python

不久前,一位 YouTuber 发布了一个谜题,并要求他的社区解决这个问题。我已经解决了这个难题,但我记得其中的一部分,我一直想在 python 中自动执行脚本。它基本上是一个随机归档了 10000 多次的文件。有人写了一个脚本,用不同的归档方法一遍又一遍地随机归档文件。 (.zip、.rar、.jar、.tar、tar.gz、.gz 和 .7z)除 .gz 文件外,我已经能够完美地提取所有这些文件类型。 tar.gz 文件使用 tarfile 模块提取得很好,但普通的 .gz 文件显然无法提取。我可以设法成功解压文件,但给我的只是原始字节数据。

所以这就是我正在尝试做的事情:

我需要在 python 中提取普通 .gz 文件(不是 tar.gz)的内容,就像我打开 7 个 zip 并使用他们的 GUI 提取一样。

有些事情要提一下:

  1. .gz 文件在七个 zip 中打开得很好。我可以查看内容并提取它们,就好像它们是普通的 .zip 文件一样。

  2. 我需要归档项目的原始文件名。我设法从其中一个 .gz 文件中提取了一个 .zip,但只有在我这样做时它才有效:

     from gzip import open as gzopen
     with gzopen(file_name, 'rb') as f_in:
         with open('file.zip', 'wb') as f_out:
            copyfileobj(f_in, f_out)
    

    问题是它总是将 .gz 提取为 file.zip,即使实际归档的文件是 .7z 或 .rar。我需要它来正确识别扩展类型并适当地命名它。

GZIP 算法不压缩 文件,它压缩 字节。当然,文件也可以看作是字节流,但文件还有很多其他属性(名称、所有者、日期、权限等)。原始字节流缺少所有这些。

因此,如果 gzip 作为可执行文件压缩文件,它只是压缩文件的内容,并保持其他所有内容(所有者、日期等)不变。除了名称:它附加了一个 .gz 后缀。

因此,如果您想知道文件的原始名称,只需去掉 .gz 后缀即可。

当然,gzip也可以用来压缩其他流,例如用户输入,或命令的输出。如果它手头没有文件,它将把压缩的字节流定向到标准输出,从那里它可以再次重定向到某个文件。而且这个文件可以有后缀 .gz 再次(而且经常有)。因此,名称以 .gz 结尾的文件不一定是不带 .gz 后缀的同名文件的压缩版本。

一些后缀组合经常被缩写,例如.tar.gz 通常被命名为 .tgz