2016-12-16 6 views
0

Я пытаюсь захватить один файл из tar-архива. У меня есть библиотека файл обработан, и я могу делать вещи, как найти файл в списке с правом пролонгации:Получение одного файла из tar-файла с использованием tarfile lib в python

как их пример:

def xml_member_files(self,members): 
    for tarinfo in members: 
     if os.path.splitext(tarinfo.name)[1] == ".xml": 
      yield tarinfo 


    member_file = self.xml_member_files(tar) 
    for m in member_file:   
     print m.name 

Это является большим, и выход:

RS2_C0RS2_OK67683_PK618800_DK549742_SLA23_20151006_234046_HH_SLC/lutBeta.xml 
RS2_C0RS2_OK67683_PK618800_DK549742_SLA23_20151006_234046_HH_SLC/lutGamma.xml 
RS2_C0RS2_OK67683_PK618800_DK549742_SLA23_20151006_234046_HH_SLC/lutSigma.xml 
RS2_C0RS2_OK67683_PK618800_DK549742_SLA23_20151006_234046_HH_SLC/product.xml 

Если я говорю, просто ищите product.xml, тогда это не сработает. Поэтому я пробовал:

ti = tar.getmember('product.xml') 
    print ti.name 

и он не нашел product.xml, потому что я догадываюсь о пути информации перед рукой. Я понятия не имею, как получить только эту информацию о пути, чтобы я мог однажды получить файл product.xml, когда-либо извлеченный (кажется, что я все-таки делаю тяжелый путь), но я, как я могу определить только этот путь, чтобы я мог конкатенатировать это для моих других функций файла для чтения и загрузки этого XML-файла после того, как он является единственным файлом, извлеченным из файла tar?

+0

Пожалуйста, ознакомьтесь с мой ответ ниже, и upvote или пометить как принятыми, если это помогло вам в продумывание проблемы. –

ответ

2

Возврат полной траектории путем итерации по результату getnames(). Например, чтобы получить полный путь к lutBeta.xml:

tar = tarfile.TarFile('mytarfile.tar') 
membername = [x for x in tar.getnames() if os.path.basename(x) == 'lutBeta.xml'][0] 
1

Я бы попробовал сначала сделать TarFile.getnames(), который, как мне кажется, очень похож на tar tzf filename.tar.gz из командной строки. Затем вы узнаете, какие пути кормить для вашего getmember() или getmembers().