Python 如何将大量tar.gz文件提取到一个目录中?

Python 如何将大量tar.gz文件提取到一个目录中?,python,extract,tar,gzip,Python,Extract,Tar,Gzip,我试图提取一些tar.gz文件,但没有成功 我试图修改我用来提取zip文件的代码。下面是我的文件结构、文件和一些代码 文件结构: D:\\Test\\Tar 文件名: DZB1212-500258L004001_4.tgz DZB1213-500119L002001_2.tgz DZB1213-500119L006001_6.tgz 我尝试过的代码: import glob import os import re import tarfile import gzip import shuti

我试图提取一些tar.gz文件,但没有成功

我试图修改我用来提取zip文件的代码。下面是我的文件结构、文件和一些代码

文件结构:

D:\\Test\\Tar
文件名:

DZB1212-500258L004001_4.tgz
DZB1213-500119L002001_2.tgz
DZB1213-500119L006001_6.tgz
我尝试过的代码:

import glob
import os
import re
import tarfile
import gzip
import shutil
os.chdir('E:\\SPRING2019\\SILKROAD\\Folder_Extraction_Auto\\SRTM_DEMs\\TESTEXTRACTER3\\USGS_Declassified\\Declass2_2002')

#set up pathing
tarfile_rootdir = ('E:\\SPRING2019\\SILKROAD\\Folder_Extraction_Auto\\SRTM_DEMs\\TESTEXTRACTER3\\USGS_Declassified\\Declass2_2002')
extract_rootdir = ('E:\\SPRING2019\\SILKROAD\\Folder_Extraction_Auto\\TEST')

#process the zip files [a-zA-Z] to [\w] and removed the _ seperating the two WORKED!!!!!!!!!!!!
re_pattern = re.compile(r'\A([\w+]*)')
#CHANGED ABOVE CREATED HTO_O with no subfolers but all extracted
for tar_file in glob.iglob(os.path.join(tarfile_rootdir, '*.tar.gz')):
    part = re.findall(re_pattern, os.path.basename(tar_file))[0]
    part = [item.upper() for item in part]
    folder = {'outer': '{0}{1}{2}{3}'.format(*part), 'inner': '{0}{1}{2}{3}'.format(*part)}
    extract_path = os.path.join(extract_rootdir, folder['outer'])
    with tarfile.open(tar_file, 'r:gz') as tarfile:
        tar_file.extractall(extract_path)

它将运行,但不会发生任何事情。

看起来您的文件名是*.tgz,但您的glob是*.tar.gz

import glob, os, re, tarfile

# Setup main paths.
tarfile_rootdir = r'D:\SPRING2019\Tarfiles'
extract_rootdir = r'D:\SPRING2019\Test'

# Process the files.
re_pattern = re.compile(r'\A(\w+)-\d+[a-zA-Z]0{0,5}(\d+)')

for tar_file in glob.iglob(os.path.join(tarfile_rootdir, '*.tgz')):

    # Get the parts from the base tgz filename using regular expressions.
    part = re.findall(re_pattern, os.path.basename(tar_file))[0]

    # Build the extraction path from each part.
    extract_path = os.path.join(extract_rootdir, *part)

    # Perform the extract of all files from the zipfile.
    with tarfile.open(tar_file, 'r:gz') as r:
        r.extractall(extract_path)
此代码的基础类似于 最后一个问题。由于不确定的信息 目录结构,我将提供一个结构作为 例如

D:\SPRING2019\Tarfiles
中的TGZ文件:

DZB1216-500058L002001.tgz
DZB1216-500058L003001.tgz
D:\SPRING2019\Test
中提取目录结构:

DZB1216
2001
3001
使用检索
.tgz
文件路径

来自示例文件名:
DZB1216-500058L002001.tgz
, 正则表达式将捕获两个组:

  • \A
    是字符串开头的锚。
    这不是一个团体
  • (\w+)
    匹配
    DZB1216

    这是第一组
  • -\d+[a-zA-Z]0{0,5}
    匹配到下一组。
    这不是一个团体
  • (\d+)
    匹配
    2001

    这是第二组
提取路径使用的值连接
extract\u rootdir
DZB1216
2001
。 这将导致
D:\SPRING2019\Test\DZB1216\2001
作为提取路径

使用
将从
.tgz
文件中提取所有内容。

文件扩展名不重要,理论上,您可以使用tar调用任何您喜欢的文件。如果你在Linux上,你可以试试'file'命令,它会告诉你它是否真的是一个Gzip tar文件。我一直在这一行上获取和索引错误:folder={'outer':{0}{1}{2}{3}。format(*part),'inner':{0}{1}{2}{3}。format(*part part}从我所见,你的正则表达式与文件名的第一个字符匹配,因此,对于上述所有文件,
part
的值为“D”。然后将其传递到
format
时,它是一个长度为1的列表,但格式字符串需要4个值。如果您的正则表达式是
r'\A([\w]*)”
?我仍然无法得到任何结果![在这里发表评论,因为我还没有对你的问题发表评论的声誉]@michael_heath是正确的,但我建议不要重复使用名称
tarfile
,因为这与导入的模块名称冲突。事实上,在最后一行中,您使用的是
taru文件
(注意下划线)。我建议更改为:
,将tarfile.open(tar_file,'r:gz')改为t:t.extractall(extract_path)
通常我会建议变量的全名,但我们已经没有办法说“tar file”。也许for循环中的
tar\u文件
应该被称为
tar\u文件路径
以获得额外的清晰性?这个修复程序让它工作了!除了我出了一个关键错误。说我的文件名找不到但设置正确你必须是老师。。。或者一个巫师。无论哪种方式,你都在向一些感谢你帮助的学生传授很多知识!非常感谢,它工作得很好!:)