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

Python:使用原始文件名和文件扩展名提取gz文件,python,gzip,filenames,unzip,gunzip,Python,Gzip,Filenames,Unzip,Gunzip,在一个文件夹下,我有许多.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.xm

在一个文件夹下,我有许多.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上Python中的所有.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文件时,仅将原始格式的un-zip文件保存为

filename.fileExtension
进入
C:\UnZipGz
文件夹。

导入gzip
导入操作系统
输入目录='C:\Xiang'
输出目录='C:\UnZipGz'
GZIP_扩展='.gz'
def生成输出路径(输出目录,压缩名称):
“”“生成将解压缩文件写入的路径。”。
:param str output_directory:用于放置文件的目录
:param str zipped_name:压缩文件的名称
:return str:
"""
没有扩展名的名称=压缩名称[:-len(gzip\u扩展名)]
返回os.path.join(输出目录,名称,不带扩展名)
对于os.scandir(输入目录)中的文件:
如果不是file.name.lower().endswith(GZIP_扩展名):
持续
输出路径=生成输出路径(输出目录,文件名)
打印('Decompressing',file.path',to',output\u path)
使用gzip.open(file.path,'rb')作为文件:
打开(输出路径“wb”)作为输出文件:
输出_file.write(file.read())
说明:

  • 使用相关扩展名遍历文件夹中的所有文件
  • 生成新目录的路径(不带gzip扩展名)
  • 打开文件并将其解压缩内容写入新路径

  • 要检索原始文件名,可以使用
    gzinfo

    导入gzinfo >>>info=gzinfo.read\ugz\uinfo('bar.txt.gz')) >>>info.fname 'foo.txt'
    提取原始文件名的引用:

    导入gzip
    导入操作系统
    输入目录='C:\Xiang'
    输出目录='C:\UnZipGz'
    GZIP_扩展='.gz'
    def生成输出路径(输出目录,压缩名称):
    “”“生成将解压缩文件写入的路径。”。
    :param str output_directory:用于放置文件的目录
    :param str zipped_name:压缩文件的名称
    :return str:
    """
    没有扩展名的名称=压缩名称[:-len(gzip\u扩展名)]
    返回os.path.join(输出目录,名称,不带扩展名)
    对于os.scandir(输入目录)中的文件:
    如果不是file.name.lower().endswith(GZIP_扩展名):
    持续
    输出路径=生成输出路径(输出目录,文件名)
    打印('Decompressing',file.path',to',output\u path)
    使用gzip.open(file.path,'rb')作为文件:
    打开(输出路径“wb”)作为输出文件:
    输出_file.write(file.read())
    
    说明:

  • 使用相关扩展名遍历文件夹中的所有文件
  • 生成新目录的路径(不带gzip扩展名)
  • 打开文件并将其解压缩内容写入新路径

  • 要检索原始文件名,可以使用
    gzinfo

    导入gzinfo >>>info=gzinfo.read\ugz\uinfo('bar.txt.gz')) >>>info.fname 'foo.txt'
    提取原始文件名的引用:


    @D Hudson,谢谢你的回答,这与我的情况相符。但是,是否有可能.gz文件的名称与其中的文件名不一致?我已经更新了我的问题。gzip文件不是存档文件。它不包含其他文件或文件名:它只是一个用gzip算法压缩的文件。要创建用gzip压缩的存档文件,通常需要将gzip与tar配对。@D Hudson,谢谢!您的意思是gz文件名将始终与底层文件名一致。如果是这样,你的代码解决了我的问题。我有点担心底层文件名可能会与gz文件名不同。压缩名与原始文件+'.gz'相同只是一种惯例。原始文件可以被称为任何名称。但是,压缩文件本身并不保留原始文件名的记录。@D Hudson,在本例中为。您上面的解决方案是不够的,因为我想提取gz文件并将unzip文件保存为原始名称。例如,原始文件是
    example1.txt
    ,gz文件被创建为
    example1.txt.gz
    ,但后来不知何故重命名为
    20200211\u example1.txt.gz
    (但在内部,文件仍然是
    example1.txt
    )。代码将把它保存在输出文件夹中。但是,我想要的是输出文件夹中的
    example1.txt
    。@D Hudson,谢谢你的回答,它适用于我的案例。但是,是否有可能.gz文件的名称与其中的文件名不一致?我已经更新了我的问题。gzip文件不是存档文件。它不包含其他文件或文件名:它只是一个用gzip算法压缩的文件。要创建用gzip压缩的存档文件,通常需要将gzip与tar配对。@D Hudson,谢谢!您的意思是gz文件名将始终与底层文件名一致。如果是这样,你的代码解决了我的问题。我有点担心底层文件名可能会与gz文件名不同