我是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(目录,存档))。我重新编写上述内容后才想到这一点。没有测试过。再次感谢。
答案 0 :(得分: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)