Tarfile Python - проверьте, существует ли файл в tar снаружи (т.е. уже извлечен)

Я новичок в stackoverflow. Извините, если этот пост лишний, но я еще не нашел ответа. Кроме того, я довольно новичок в Python. Я хотел бы извлечь файлы из файла tar, если они еще не существуют в корневом каталоге, где существует файл tar. Я пробовал несколько версий. Я думаю, что в приведенном ниже коде есть некоторая избыточность, и он не делает то, что мне нужно. Он просто продолжает извлекать и перезаписывать существующие файлы.

Файлы, которые необходимо извлечь, всегда заканчиваются на «_B7.TIF». В настоящее время код принимает один аргумент — полный путь к каталогу, содержащему tar-файл.

import os, shutil, sys, tarfile 
directory = sys.argv[1]

tifFiles = []
for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith(".TIF"):
            # also tried tifFiles.append(file)
            tifFiles.append(file.name)
        elif file.endswith(".tar.gz"):
            tar = tarfile.open(root + "/" + file)
            for item in tar:
                if str(item) in tifFiles:
                    print "{0} has already been unzipped.".format(str(item))
                elif "_B7" in str(item):
                    tar.extract(item, path=root)
shutil.rmtree(root + "\gap_mask")

Вот еще одна версия, которая, похоже, ничего не делает. Я пытался упростить...

import os, shutil, sys, tarfile
directory = sys.argv[1]

for root, dirs, files in os.walk(directory):
    if file not in tarfile.getnames() and file.endswith("_B7.TIF"):
        tar.extract(file, path=root)
    else:
        print "File: {0} has already been unzipped.".format(file)
shutil.rmtree(root + "\gap_mask")

Спасибо вам обоим за ваши комментарии/предложения. Оба в чем-то помогли. Этот код работает для меня.

import os, shutil, sys, tarfile
folder = sys.argv[1]

listFiles = os.listdir(folder)

try:
    for file in listFiles:
        if file.endswith(".tar.gz"):
            sceneTIF = file[:-7] + "_B7.TIF"
            if os.path.exists(os.path.join(folder,sceneTIF)):
                print sceneTIF, "has already been extracted."
            else:
                tar = tarfile.open(os.path.join(folder,file))
                for item in tar:
                    if "_B7" in str(item):
                        tar.extract(item, path=folder)
    shutil.rmtree(os.path.join(folder,"gap_mask")
except WindowsError:
    pass

Любые мысли о стиле/избыточности/способах сделать это лучше? Томас, ваш код не работал прямо из коробки. Я думаю, что это был компонент tarfile.open. Вероятно, нужен tarfile.open(os.path.join(каталог, архив)). Я подумал об этом только после того, как переработал вышеизложенное. Не тестировал. Еще раз спасибо.


person dgj32784    schedule 28.04.2013    source источник
comment
Вы можете использовать os.path.join(root, file) вместо root + "/" + file, что зависит от платформы.   -  person Chris Medrela    schedule 28.04.2013


Ответы (1)


os.walk перебирает деревья каталогов, включая подкаталоги. Судя по вашему описанию, это не то, что вам нужно. Кроме того, только те файлы, которые встречаются раньше, чем ваши tar-файлы, будут считаться существующими.

Гораздо проще просто проверить наличие файлов, с которыми вы сталкиваетесь:

import sys
import os
import tarfile

directory = sys.argv[1]

def extract_nonexisting(archive):
    for name in archive.getnames():
        if os.path.exists(os.path.join(directory, name)):
            print name, "already exists"
        else:
            archive.extract(name, path=directory)

archives = [name for name in os.listdir(directory) if name.endswith("tar.gz")]
for archive_name in archives:
    with tarfile.open(archive_name) as archive:
        extract_nonexisting(archive)
person Thomas Fenzl    schedule 28.04.2013