我有需要添加到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)
答案 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)
有几件事......
你可以,但你可能不应该使用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))