在 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 提取一样。
有些事情要提一下:
.gz 文件在七个 zip 中打开得很好。我可以查看内容并提取它们,就好像它们是普通的 .zip 文件一样。
我需要归档项目的原始文件名。我设法从其中一个 .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
。
不久前,一位 YouTuber 发布了一个谜题,并要求他的社区解决这个问题。我已经解决了这个难题,但我记得其中的一部分,我一直想在 python 中自动执行脚本。它基本上是一个随机归档了 10000 多次的文件。有人写了一个脚本,用不同的归档方法一遍又一遍地随机归档文件。 (.zip、.rar、.jar、.tar、tar.gz、.gz 和 .7z)除 .gz 文件外,我已经能够完美地提取所有这些文件类型。 tar.gz 文件使用 tarfile
模块提取得很好,但普通的 .gz 文件显然无法提取。我可以设法成功解压文件,但给我的只是原始字节数据。
所以这就是我正在尝试做的事情:
我需要在 python 中提取普通 .gz 文件(不是 tar.gz)的内容,就像我打开 7 个 zip 并使用他们的 GUI 提取一样。
有些事情要提一下:
.gz 文件在七个 zip 中打开得很好。我可以查看内容并提取它们,就好像它们是普通的 .zip 文件一样。
我需要归档项目的原始文件名。我设法从其中一个 .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
。