python 3.7中的tarfile过滤器
这是我的备份脚本的一部分,我分离出来进行测试。这在Python3.6中曾经起作用,但在Python3.7中出现了错误。我查了一下文件,但不知道发生了什么变化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/" ###############################
#! /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],这表明类型不正确-
测试中的第一个即使对象类型错误也不会崩溃-但这是正确的方法)谢谢,我现在更明白了。