Я новичок в 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(каталог, архив)). Я подумал об этом только после того, как переработал вышеизложенное. Не тестировал. Еще раз спасибо.
os.path.join(root, file)
вместоroot + "/" + file
, что зависит от платформы. - person Chris Medrela   schedule 28.04.2013