当前位置: 首页 > 面试题库 >

Python tarfile和排除

糜淇
2023-03-14
问题内容

这是Python文档的摘录:

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

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

此外:

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

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

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

… 回到原点 :)

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

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

PS:

这只是我的想法:

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

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


问题答案:

如果给出了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)


 类似资料:
  • 基数排序 from typing import List def radix_sort(arr: List) -> List: """ 基础排序 核心思想: 一共有0-9为数字的桶,一共10个,一共循环数组中最大数的位数次(如最大数是1000则是4次个十百千位分别循环), 每一次循环依次从数中取出个、十、百、千、万...位数上的数值放到对应的桶中,如果该位上没有

  • 问题内容: 如何使用单选按钮对jtable列进行排序? 我的jtable是defaultTableModel而不是向量。 当用户按下列标题时,我已经实现了,它将进行排序,现在我必须使用单选按钮来实现。 实现此目标的最佳方法是什么? 问题答案: 要以编程方式进行排序,请将以下代码添加到侦听器中:

  • 快速排序 from typing import List def quick_sort(arr: List, left, right) -> List: """ 快速排序是对冒泡排序的改进,核心思想是找到一个中值点pivot,然后将小于等于pivot的放在pivot的左边,大于pivot的放在右边,一直递归到无法拆分pivot点。 :param arr: :re

  • 插入排序 """ 插入排序核心思想 将数组分成一个有序数组和一个无序数组 每次从无序数组中提一个元素出来 插入到 有序元素的合适位置 """ from typing import List def insert_sort(arr: List) -> List: """ 插入排序 :param arr: :return: """ target =

  • 冒泡排序 from typing import List """ 核心思想是循环length-1次,每次循序找出最大或者最小的一个数,每次比较相邻的两个数,如果大或者小就交换位置,每一次循环可以比较当次最大的一个数。 例如 3, 10, -1, 20,8 - 第一次循环 1. 指针下移指向 3 3和10比较 不交换 3 10 -1 20 8 2. 指针下移指向 10 10>-1 交换

  • 我试图将查询与exclude查询一起使用,以便它匹配除要排除的术语之外的所有术语。我在一个基本的URI查询中找到了它,但不是常规的JSON查询。如何将此URI转换为JSON类型查询? 其中是不匹配的标记列表。 这是我目前所掌握的: 但是,当我这样做时,仍然包含在结果中。如何排除?

  • 将属性包含到模型中意味着 EF 将获得该属性的元数据,并且将尝试从数据库读取该属性的值或将该属性的值写入到数据库。 惯例 按照惯例,具有 getter 和 setter 访问器的公共(public)属性将被包含在模型中。 数据注解 可以使用数据注解将属性从模型中排除。 public class Blog { public int BlogId { get; set; } publi

  • 将类型包含到模型中意味着 EF 将获得该类型的元数据,并且将尝试从数据库读取该类型的实例或将该类型的实例写入到数据库。 惯例 按照惯例,在上下文中通过 DbSet 属性暴露的类型都将包含在模型中。另外,在 OnModelCreating 方法中提及的类型也会被包含在模型中。最后,通过递归扫描已包含(在模型中的)类型的导航属性所找到的任何类型都将包含在模型中。 比如,以下代码列出的三个类型都已包含在