Python: 从 tar.gz 提取具有模式的特定文件而不提取完整文件
Python: Extracting specific files with pattern from tar.gz without extracting the complete file
我想从许多 tar.gz 个文件中提取具有模式 *_sl_H*
的所有文件,而不从存档中提取所有文件。
我找到了这些行,但是无法使用通配符 (https://pymotw.com/2/tarfile/):
import tarfile
import os
os.mkdir('outdir')
t = tarfile.open('example.tar', 'r')
t.extractall('outdir', members=[t.getmember('README.txt')])
print os.listdir('outdir')
有人有想法吗?
非常感谢。
看看 TarFile.getmembers()
方法,其中 returns 存档的成员作为列表。有了这个列表后,您可以根据条件决定要提取哪个文件。
import tarfile
import os
os.mkdir('outdir')
t = tarfile.open('example.tar', 'r')
for member in t.getmembers():
if "_sl_H" in member.name:
t.extract(member, "outdir")
print os.listdir('outdir')
您可以从许多 tar 中提取与您的模式匹配的所有文件,如下所示:
使用 glob
获取给定文件夹中所有 *.tar
或 *.gz
文件的列表。
对于每个 tar 文件,使用 getmembers()
函数获取每个 tar 文件中的文件列表。
使用正则表达式(或简单的if "xxx" in
测试)过滤所需的文件。
将此匹配文件列表传递给 extractall()
函数中的 members
参数。
添加了异常处理以捕获编码错误的 tar 文件。
例如:
import tarfile
import glob
import re
reT = re.compile(r'.*?_sl_H.*?')
for tar_filename in glob.glob(r'\my_source_folder\*.tar'):
try:
t = tarfile.open(tar_filename, 'r')
except IOError as e:
print(e)
else:
t.extractall('outdir', members=[m for m in t.getmembers() if reT.search(m.name)])
我想从许多 tar.gz 个文件中提取具有模式 *_sl_H*
的所有文件,而不从存档中提取所有文件。
我找到了这些行,但是无法使用通配符 (https://pymotw.com/2/tarfile/):
import tarfile
import os
os.mkdir('outdir')
t = tarfile.open('example.tar', 'r')
t.extractall('outdir', members=[t.getmember('README.txt')])
print os.listdir('outdir')
有人有想法吗? 非常感谢。
看看 TarFile.getmembers()
方法,其中 returns 存档的成员作为列表。有了这个列表后,您可以根据条件决定要提取哪个文件。
import tarfile
import os
os.mkdir('outdir')
t = tarfile.open('example.tar', 'r')
for member in t.getmembers():
if "_sl_H" in member.name:
t.extract(member, "outdir")
print os.listdir('outdir')
您可以从许多 tar 中提取与您的模式匹配的所有文件,如下所示:
使用
glob
获取给定文件夹中所有*.tar
或*.gz
文件的列表。对于每个 tar 文件,使用
getmembers()
函数获取每个 tar 文件中的文件列表。使用正则表达式(或简单的
if "xxx" in
测试)过滤所需的文件。将此匹配文件列表传递给
extractall()
函数中的members
参数。添加了异常处理以捕获编码错误的 tar 文件。
例如:
import tarfile
import glob
import re
reT = re.compile(r'.*?_sl_H.*?')
for tar_filename in glob.glob(r'\my_source_folder\*.tar'):
try:
t = tarfile.open(tar_filename, 'r')
except IOError as e:
print(e)
else:
t.extractall('outdir', members=[m for m in t.getmembers() if reT.search(m.name)])