使用Python将多个目录中的多个文件添加到unique.tar.gz归档文件中

使用Python将多个目录中的多个文件添加到unique.tar.gz归档文件中,python,tar,Python,Tar,我有需要添加到tar存档的文件目录。目录结构为: ..\root\path\dirname\somefiles.txt 并且包含somefiles.ext的.tar.gz文件应以以下格式存放到..\root\path\as中: ..\root\path\dirname.tar.gz 我目前拥有的代码是: import os, tarfile for root, dirs, files in os.walk('.'): for dir in dirs: tar = t

我有需要添加到tar存档的文件目录。目录结构为:

..\root\path\dirname\somefiles.txt
并且包含somefiles.ext的.tar.gz文件应以以下格式存放到..\root\path\as中:

..\root\path\dirname.tar.gz
我目前拥有的代码是:

import os, tarfile

for root, dirs, files in os.walk('.'):
    for dir in dirs:
        tar = tarfile.open(dir + '.tar.gz', 'w:gz')
        for file in files:
            tar.add(os.path.join(root, file))
        tar.close()
但是,这会从
。\root\path\
而不是
。\root\path\dirname\
提取文件。我如何写这个来从每个目录中提取文件并将它们添加到目录同名的存档中

编辑

通过使用@mVChr的代码,我能够获得我需要的东西。我添加了
arcname=f
以删除存档中的目录;我不知道为什么我以前没有实施这一点:

import os, tarfile

for root, dirs, _ in os.walk('.'):
    for d in dirs:
        with tarfile.open(d + '.tar.gz', 'w:gz') as tar:
            for _, _, files in os.walk(os.path.join(root, d)):
                for f in files:
                    tar.add(os.path.join(root, d, f), arcname=f)
也许是这样

#!/usr/local/cpython-3.3/bin/python

import os
import glob
import tarfile

def main():
    directories = [ dirname for dirname in glob.glob('*') if not dirname.endswith('.tar.gz') ]

    for directory in directories:
        print('working on {}'.format(directory))
        for root, dirs, filenames in os.walk(directory):
            tar = tarfile.open('{}.tar.gz'.format(directory), 'w:gz')
            for filename in filenames:
                tar.add(os.path.join(root, filename))
            tar.close()

main()
有几件事

可以,但可能不应该使用
dir
file
作为变量名,因为它们在Python中已经有了含义

您可能应该将
tarfile.open
放在
with
语句中,这样您就可以确保它将
close()

话虽如此,这段稍加修改的代码完成了您的任务:

import os, tarfile

for root, dirs, _ in os.walk('.'):
    for d in dirs:
        with tarfile.open(d + '.tar.gz', 'w:gz') as tar:
            for _, _, files in os.walk(os.path.join(root, d)):
                for f in files:
                    tar.add(os.path.join(root, d, f))

这将在归档文件中创建一个目录,名为..\root\path\dirname.tar.gz\dirname\somefiles.ext我正在查找..\root\path\dirname.tar.gz\somefiles.ext。我明白你提到变量名的意思了。这也会在归档文件中创建一个目录:…\root\path\dirname.tar.gz\dirname\somefiles.ext您还遗漏了tar.close()。我没有遗漏
tar.close()
,这是我关于将
一起使用的观点,它为您做到了这一点。和
inspect.getsource(tarfile.tarfile.\uuu退出)
Ah,我明白了。我的错误。是否可以在此过程中截断目录层次结构?我只想要文件,不要文件夹。。。