我正在将Python 3与tarfile
模块一起使用来压缩某些文件夹(带有子文件夹)。我需要做的是:设置几个子文件夹,以将它们从最终的tar文件中排除。
例如,假设我的文件夹如下:
dir/
├── subdirA
│ ├── subsubdirA1
│ │ └── fileA11.txt
│ │ └── fileA12.txt
│ ├── subsubdirA2
│ │ └── fileA21.txt
│ │ └── fileA22.txt
│ └── fileA.txt
├── subdirB
│ ├── subsubdirB1
│ │ └── fileB11.txt
│ │ └── fileA12.txt
│ ├── subsubdirB2
│ │ └── fileB21.txt
│ │ └── fileB22.txt
│ └── fileB.txt
└── main.txt
现在,我说我想将dir/
和subsubdirA2
的内容之外的所有内容都包含在subsubdirB2
中。基于this answer,我尝试了:
EXCLUDE_FILES = ['/subdirA/subsubdirA2', '/subdirB/subsubdirB2']
mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)
或者:
EXCLUDE_FILES = ['/subdirA/subsubdirA2/*', '/subdirB/subsubdirB2/*']
mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)
或者:
EXCLUDE_FILES = ['/subdirA/subsubdirA2/*.*', '/subdirB/subsubdirB2/*.*']
mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)
我还尝试了上面三个选项的变体,其中子文件夹路径以/
或dir
或/dir
开头。没有任何工作-一直都包含dir
中的所有内容。
如何从要生成的tar文件中正确排除特定的子文件夹?如果需要一个不同的模块/库而不是tarfile
,就可以了。
答案 0 :(得分:0)
我没有找到所需的有关tarfile的参考,但是您可以使用线程并像这样包含shell命令:
import subprocess
exclude=['dir/subdirA/subsubdirA2','dir/subdirA/subsubdirA1','dir/subdirA/text.tx']
excludeline=''
for x in exclude:
excludeline += ' --exclude '+x
# cmd has tar command
cmd='tar -czvf dir.tar dir '+ excludeline
print(cmd)
process = subprocess.Popen(cmd,shell=True,stdin=None,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
result=process.stdout.readlines()
# All files were compressed
if len(result) >= 1:
for line in result:
print(line.decode("utf-8"))
在此示例中cmd有价值的地方:
cmd = tar -czvf dir.tar dir --exclude dir/subdirA/subsubdirA2 --exclude dir/subdirA/subsubdirA1 --exclude dir/subdirA/text.tx
答案 1 :(得分:0)
我认为您正在使用的EXCLUDE_FILES
应该与带有模式匹配的文件名相匹配。这是我的处理方式:
import re, os
EXCLUDE_FILES = ['/subdirA/subsubdirA2/*', '/subdirB/subsubdirB2/*']
pattern = '(?:% s)' % '|'.join(EXCLUDE_FILES) #form a pattern string
要针对模式使用过滤器,我们将使用re.match
,
mytarfile.add(..., filter=lambda x: None if re.match(pattern, x.name) else x)
如果file.name
与EXCLUDE_FILES
中指定的任何模式匹配,我们将排除该文件。希望这会有所帮助。