Python tarfile - 检查 tar 中的文件是不是存在于外部(即已被提取)

Posted

技术标签:

【中文标题】Python tarfile - 检查 tar 中的文件是不是存在于外部(即已被提取)【英文标题】:Python tarfile - check if file in tar exists outside (i.e., already been extracted)Python tarfile - 检查 tar 中的文件是否存在于外部(即已被提取) 【发布时间】:2013-04-22 09:52:08 【问题描述】:

我是 *** 的新手。对不起,如果这篇文章是多余的,但我还没有找到答案。另外,我对 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")

感谢你们两位的 cmets/建议。他们都以某种方式提供了帮助。这段代码对我有用。

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(directory, archive))。我只是在修改上述内容后才想到这一点。没有测试过。再次感谢。

【问题讨论】:

您可以使用os.path.join(root, file) 代替root + "/" + file,这取决于平台。 【参考方案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)

【讨论】:

以上是关于Python tarfile - 检查 tar 中的文件是不是存在于外部(即已被提取)的主要内容,如果未能解决你的问题,请参考以下文章

Python中使用tarfile压缩解压tar归档文件示例(最新+全面=强烈推荐! ! !)

Python:tarfile流

tarfile/zipfile/shutil

哪位哥哥能给个python中 tarfile,gzip,zlib 用法的代码

Python之tarfile模块的使用

Python tarfile 不会解压