使用Python将多个目录中的多个文件添加到唯一的.tar.gz存档

时间:2013-11-22 01:01:08

标签: 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 = 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)

2 个答案:

答案 0 :(得分:0)

也许是这样的?

#!/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()

答案 1 :(得分:0)

有几件事......

你可以,但你可能不应该使用dirfile作为变量名,因为那些已经在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))