Python tarfile和排除

发布于 2021-01-29 17:29:38

这是Python文档的摘录:

如果给出了exclude,则它必须是一个使用一个文件名参数并返回布尔值的函数。根据此值,相应文件被排除(真)或被添加(假)。

我必须承认我不知道那意味着什么。

此外:

从2.7版开始不推荐使用:不推荐使用exclude参数,请改用filter参数。为了获得最大的可移植性,应将filter用作关键字参数而不是位置参数,以便在最终删除exclude时不会影响代码。

好的…以及“过滤器”的定义:

如果指定了filter,则它必须是一个接受TarInfo对象参数并返回更改后的TarInfo对象的函数。如果改为返回None,则将从存档中排除TarInfo对象。

… 回到原点 :)

我真正需要的是一种将排除项的数组(或“:”定界字符串)传递给tarfile.add的方法。

我不介意您尝试解释PyDocs中的内容。

PS:

这只是我的想法:

  • 制作源目录内容列表的数组
  • 弹出排除
  • 对剩下的单个数组成员执行tar.add

但是,我希望它以一种更有文化色彩的方式来完成

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果给出了exclude,则它必须是一个使用一个文件名参数并返回布尔值的函数。根据此值,相应文件被排除(真)或被添加(假)。

    例如,如果要排除所有以字母“ a”开头的文件名,则可以执行以下操作:

    def exclude_function(filename):
        if filename.startswith('a'):
            return True
        else:
            return False
    
    mytarfile.add(..., exclude=exclude_function)
    

    对于您的情况,您想要类似…

    EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']
    
    def exclude_function(filename):
        if filename in EXCLUDE_FILES:
            return True
        else:
            return False
    
    mytarfile.add(..., exclude=exclude_function)
    

    …可以减少到…

    EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']
    
    mytarfile.add(..., exclude=lambda x: x in EXCLUDE_FILES)
    

    更新资料

    TBH,我不必担心过时警告,但是如果您想使用新filter参数,则需要类似…

    EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']
    
    def filter_function(tarinfo):
        if tarinfo.name in EXCLUDE_FILES:
            return None
        else:
            return tarinfo
    
    mytarfile.add(..., filter=filter_function)
    

    …可以减少到…

    EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']
    
    mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看