gpt4 book ai didi

python - 使用 Python 的 tarfile 时覆盖现有的只读文件

转载 作者:太空狗 更新时间:2023-10-29 18:30:55 25 4
gpt4 key购买 nike

我正在尝试使用 Python 的 tarfile 模块来提取 tar.gz 存档。

我希望提取覆盖任何目标文件,因为它们已经存在 - 这是 tarfile 的正常行为。

但是,我打了一个小报告,因为某些文件具有写保护(例如 chmod 550)。

tarfile.extractall() 操作实际上失败了:

IOError: [Errno 13] Permission denied '/foo/bar/file'

如果我尝试从普通命令行删除文件,我可以做到,我只需要回答一个提示:

$ rm <filename>
rm: <filename>: override protection 550 (yes/no)? yes

普通的 GNU tar 实用程序也可以毫不费力地处理这些文件 - 它只是在您提取时覆盖它们。

我的用户是文件的所有者,因此在运行 tarfile.extractall 之前递归地 chmod 目标文件并不难。或者我可以使用 shutil.rmtree 预先吹走目标,这是我现在使用的解决方法。但是,这感觉有点老套。

是否有更 Pythonic 的方式来处理覆盖 tarfile 中的只读文件、使用异常或类似的东西?

最佳答案

您可以遍历 tarball 的成员并提取/处理每个文件的错误:

在现代版本的 Python 中,我会使用 with 语句:

import os, tarfile

with tarfile.TarFile('myfile.tar', 'r', errorlevel=1) as tar:
for file_ in tar:
try:
tar.extract(file_)
except IOError as e:
os.remove(file_.name)
tar.extract(file_)
finally:
os.chmod(file_.name, file_.mode)

如果您不能使用 with,只需将 with 语句 block 替换为:

tarball = tarfile.open('myfile.tar', 'r', errorlevel=1)
for file_ in tar:

如果你的 tar ball 是 gzipped 的,有一个快速的捷径来处理它:

tarfile.open('myfile.tar.gz', 'r:gz')

如果 tarfile.extractall 有覆盖选项就更好了。

关于python - 使用 Python 的 tarfile 时覆盖现有的只读文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7237475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com