python 3.7中的tarfile过滤器

python 3.7中的tarfile过滤器,python,python-3.7,tarfile,Python,Python 3.7,Tarfile,这是我的备份脚本的一部分,我分离出来进行测试。这在Python3.6中曾经起作用,但在Python3.7中出现了错误。我查了一下文件,但不知道发生了什么变化 #! /usr/bin/python import os import tarfile import arrow stmp = arrow.now().format('YYYY-MM-DD') backup_path = "/home/akya/playground/" ###############################

这是我的备份脚本的一部分,我分离出来进行测试。这在Python3.6中曾经起作用,但在Python3.7中出现了错误。我查了一下文件,但不知道发生了什么变化

#! /usr/bin/python

import os
import tarfile
import arrow


stmp = arrow.now().format('YYYY-MM-DD')
backup_path = "/home/akya/playground/"

###########################################################
# Functions
###########################################################

def exclude_function(filename):
    if filename in exclude_files or os.path.splitext(filename)[1] in exclude_files:
        return True
    else:
        return False

def compress():
    with tarfile.open(myfile, "w:gz") as tar:
        for name in L:
            tar.add(name, filter=exclude_function)

path1 = "/home/akya/playground/test"
backup_name = "test-"

L = [path1]
exclude_files = [".sh", ".html", ".json", "/home/akya/playground/test/.git"]
myfile = str(backup_path + backup_name + stmp + ".tar.gz")

compress()
我希望tarfile排除exclude_文件中的任何扩展名和路径。这就是我得到的

Traceback (most recent call last):
  File "exec.py", line 33, in <module>
    compress()
  File "exec.py", line 24, in compress
    tar.add(name, filter=exclude_function)
  File "/usr/lib/python3.7/tarfile.py", line 1934, in add
    tarinfo = filter(tarinfo)
  File "exec.py", line 16, in exclude_function
    if filename in exclude_files or os.path.splitext(filename)[1] in exclude_files:
  File "/usr/lib/python3.7/posixpath.py", line 122, in splitext
    p = os.fspath(p)
TypeError: expected str, bytes or os.PathLike object, not TarInfo
回溯(最近一次呼叫最后一次):
文件“exec.py”,第33行,在
压缩()
压缩文件“exec.py”,第24行
tar.add(名称,过滤器=排除函数)
文件“/usr/lib/python3.7/tarfile.py”,第1934行,添加
tarinfo=过滤器(tarinfo)
文件“exec.py”,第16行,在exclude_函数中
如果exclude_文件中的文件名或exclude_文件中的os.path.splitext(文件名)[1]:
splitext中的文件“/usr/lib/python3.7/posixpath.py”,第122行
p=os.fspath(p)
TypeError:应为str、bytes或os.PathLike对象,而不是TarInfo

有人能指出所需的更改吗?还是使用过滤器的更好方法?

过滤器
回调将结构传递给回调,因此您可以按名称以外的内容进行过滤:日期、大小、修改时间(看起来非常像
stat
对象)

此外,它也不是这样工作的(返回布尔值),如果要排除此条目,则必须返回
None

添加(name,arcname=None,recursive=True,*,filter=None)

。。。 如果给定了筛选器,则它应该是一个函数,该函数接受TarInfo对象参数并返回已更改的TarInfo对象。如果它返回None,则TarInfo对象将从存档中排除。有关示例,请参见示例

在您的情况下,只要选择
.name
字段,如果与您的过滤器匹配,则返回
None
。否则返回您收到的相同的
tarinfo
结构

def exclude_function(tarinfo):
    filename = tarinfo.name
    return None if filename in exclude_files or os.path.splitext(filename)[1] in exclude_files else tarinfo

(请注意,我不知道为什么它在早期版本中对您有效,可能您在exclude_files
部分添加了
或os.path.splitext(filename)[1],这表明类型不正确-
测试中的第一个
即使对象类型错误也不会崩溃-但这是正确的方法)

谢谢,我现在更明白了。