Python:使用原始文件名和文件扩展名提取 gz 文件并保留原始文件名和文件扩展名

Python: Extract gz files with and honor original filenames and file extensions

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

例如gz (the original/compressed file 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)
...

我怎么能简单地将 Python 上 Windows 10 中的所有 .gz 文件压缩到文件夹 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 文件夹。

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'

提取原文件名参考: