让Python tarfile跳过没有读权限的文件
我正在尝试写一个函数,用来在Windows XP上备份一个包含不同权限文件的目录。我使用tarfile模块来打包这个目录。目前,当程序遇到一个没有读取权限的文件时,它就会停止,并给出错误提示:IOError: [Errno 13] 权限被拒绝:'文件路径'。我希望它能跳过那些无法读取的文件,而不是直接结束打包操作。以下是我现在使用的代码:
def compressTar():
"""Build and gzip the tar archive."""
folder = 'C:\\Documents and Settings'
tar = tarfile.open ("C:\\WINDOWS\\Program\\archive.tar.gz", "w:gz")
try:
print "Attempting to build a backup archive"
tar.add(folder)
except:
print "Permission denied attempting to create a backup archive"
print "Building a limited archive conatining files with read permissions."
for root, dirs, files in os.walk(folder):
for f in files:
tar.add(os.path.join(root, f))
for d in dirs:
tar.add(os.path.join(root, d))
3 个回答
-1
补充一下大家说的内容,Python里有一个内置的函数,你可以用它来检查文件是否具备某个属性。你只需要把文件路径和你想检查的属性传给这个函数,比如:hasattr('/path/to/file.txt', "read")
用来检查文件是否可以读取,或者 hasattr('/path/to/file.txt', "write")
来检查文件是否可以写入,依此类推。希望这对其他人也有帮助。
1
你需要在尝试添加具有读取权限的文件时,也使用相同的 try
/except
结构。现在,如果任何文件或子目录无法读取,你的程序就会崩溃。
另一种不那么依赖于 try
结构的方法是,在尝试将文件或文件夹添加到你的压缩包之前,先检查它们的权限。关于如何最好地做到这一点,有一个完整的问题讨论(还有一些在使用Windows时需要避免的陷阱): Python - 测试目录权限
基本的伪代码可能是这样的:
if folder has read permissions:
add folder to tarball
else:
for each item in folder:
if item has read permission:
add item to tarball
2
你应该多加一些尝试语句:
for root, dirs, files in os.walk(folder):
for f in files:
try:
tar.add(os.path.join(root, f))
except IOError:
pass
for d in dirs:
try:
tar.add(os.path.join(root, d), recursive=False)
except IOError:
pass
[编辑] 由于Tarfile.add默认是递归的,所以在添加目录时,我加了一个recursive=False
的参数,不然可能会遇到一些问题。