【问题标题】:Python: Extract gz files with and honor original filenames and file extensionsPython:提取 gz 文件并尊重原始文件名和文件扩展名
【发布时间】:2021-05-15 00:42:58
【问题描述】:

在一个文件夹下,我有许多 .gz 文件,在这些 gz 文件中,有些是 .txt,有些是 .csv,有些是 .xml,或其他一些扩展名。

例如gz(原始/压缩文件in())文件夹中的文件将是

C:\Xiang\filename1.txt.gz (filename1.txt)
C:\Xiang\filename2.txt.gz (filename2.txt)
C:\Xiang\some_prefix_filename3.txt.gz (filename3.txt)
...
C:\Xiang\xmlfile1.xml_some_postfix.gz   (xmlfile1.xml)
C:\Xiang\yyyymmddxmlfile2.xml.gz       (xmlfile2.xml)
...
C:\Xiang\someotherName.csv.gz            (someotherName.csv)
C:\Xiang\possiblePrefixsomeotherfile1.someotherExtension.gz (someotherfile1.someotherExtension)
C:\Xiang\someotherfile2.someotherExtensionPossiblePostfix.gz (someotherfile2.someotherExtension)
...

如何在Windows 10上将所有.gz文件在Windows 10文件夹C:\Xiang下简单地压缩并保存到文件夹C:\UnZipGz中,使用原始文件名,结果如下:

C:\UnZipGz\filename1.txt
C:\UnZipGz\filename2.txt
C:\UnZipGz\filename3.txt
...
C:\UnZipGz\xmlfile1.xml.
C:\UnZipGz\xmlfile2.xml.
...
C:\UnZipGz\someotherName.csv.
C:\UnZipGz\someotherfile1.someotherExtension
C:\UnZipGz\someotherfile2.someotherExtension
...

一般情况下,gz 文件的命名约定与里面文件的文件名是一致的,但并非总是如此。不知何故,过去重命名了一些 .gz 文件。现在gz文件名不一定和gz文件中的文件名匹配。

如何提取所有 gz 文件并保留原始文件的文件名和扩展名。即,无论gz文件如何命名,在提取gz文件时,只将解压缩文件以原始格式保存为

filename.fileExtension

进入C:\UnZipGz 文件夹。

【问题讨论】:

  • 在 linux 中,使用命令gunzip -N 可以尊重原始文件名。有谁知道如何在 Windows cmd 或 Python 代码中执行此操作?见帖子:superuser.com/questions/859785/…
  • 使用github.com/PierreSelim/gzinfo,查看我的更新答案
  • @D Hudson,超级!非常感谢。
  • 没问题。如果我的回答解决了你的问题,请采纳。非常感谢

标签: python gzip filenames unzip gunzip


【解决方案1】:
import gzip
import os


INPUT_DIRECTORY = 'C:\Xiang'
OUTPUT_DIRECTORY = 'C:\UnZipGz'
GZIP_EXTENSION = '.gz'


def make_output_path(output_directory, zipped_name):
    """ Generate a path to write the unzipped file to.

    :param str output_directory: Directory to place the file in
    :param str zipped_name: Name of the zipped file
    :return str:
    """
    name_without_gzip_extension = zipped_name[:-len(GZIP_EXTENSION)]
    return os.path.join(output_directory, name_without_gzip_extension)


for file in os.scandir(INPUT_DIRECTORY):
    if not file.name.lower().endswith(GZIP_EXTENSION):
        continue

    output_path = make_output_path(OUTPUT_DIRECTORY, file.name)

    print('Decompressing', file.path, 'to', output_path)

    with gzip.open(file.path, 'rb') as file:
        with open(output_path, 'wb') as output_file:
            output_file.write(file.read())

解释:

  1. 遍历文件夹中具有相关扩展名的所有文件。
  2. 生成不带 gzip 扩展名的新目录的路径。
  3. 打开文件并将其解压后的内容写入新路径。

要检索原始文件名,可以使用gzinfohttps://github.com/PierreSelim/gzinfo

>>> import gzinfo
>>> info = gzinfo.read_gz_info('bar.txt.gz')
>>> info.fname
'foo.txt'

提取原始文件名的参考:

【讨论】:

  • @D Hudson,谢谢你的回答,它适用于我的情况。但是会不会是.gz文件的名字和里面的文件名不一致呢?我已经更新了我的问题。
  • 压缩文件不是存档。它不包含其他文件或文件名:它只是一个使用 gzip 算法压缩的文件。要创建使用 gzip 压缩的存档,通常将 gzip 与 tar 配对。
  • @D Hudson,谢谢!您的意思是 gz 文件名将始终与基础文件文件名一致。如果是这样,你的代码解决了我的问题。我有点担心底层文件文件名可能与 gz 文件名不同。
  • 压缩后的名字和原文件一样+'.gz'只是一个约定。原始文件可以被称为任何东西。但是,压缩文件本身并没有保留原始文件名的记录。
  • @D Hudson,在这种情况下。您的上述解决方案还不够,因为我想提取 gz 文件并将解压缩文件保存为原始名称。例如。原始文件是example1.txt,一个gz文件被创建为example1.txt.gz,但后来以某种方式重命名为20200211_example1.txt.gz(但在内部,文件仍然是example1.txt)。您的代码会将其20200211_example1.txt 保存在输出文件夹中。但是,我想要的是输出文件夹中的example1.txt
猜你喜欢
  • 1970-01-01
  • 2012-04-05
  • 2011-06-04
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多