我正在尝试使用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在运行之前清除目标,这是我现在使用的解决方法。但是,这感觉有些hackish。
是否有一种更具Python风格的方式来处理tar文件中的覆盖只读文件,使用异常或类似的东西?
with
语句将处理打开存档时引发的ReadError
异常。如果出现错误,它还会自动关闭文件。如果您想要更具体的错误处理,可能需要在早期的try/except
中显式打开文件,或者编写自己的上下文管理器以处理不同的情况。 - stderrtarfile.open("1.tar.gz", "r")
替换为tarfile.open("1.tar.gz", "r:gz")
解决了这个问题。为什么?根据文档,“r”与“r:*”相同,对于.gz归档文件来说是“r:gz”。 - Violet Giraffefinally
块中要用os.chmod
?提取出来的文件不会保留其权限吗,无需重新设置权限吗? - jpyams