python - 在python中设置对压缩文件的权限

标签 python zip

我有一个文件 test.txt,它位于 zip 存档 test.zip 中。 test.txt 的权限在压缩时是我无法控制的,但现在我希望它们是组可写的。我正在用 Python 提取文件,不想转义到 shell。

编辑: 到目前为止,这是我得到的:

import zipfile

z = zipfile.ZipFile('test.zip', 'w')
zi = zipfile.ZipInfo('test.txt')
zi.external_attr = 0777 << 16L
z.writestr(zi, 'FOO')
z.close()

z = zipfile.ZipFile('test.zip', 'r')
for name in z.namelist():
    newFile = open(name, "wb")
    newFile.write(z.read(name))

    newFile.close()
z.close()

这在使用 2.5.1 的 OS X 上完美运行,但在我的家庭机器(Debian、Python 2.4 和 2.5)或使用 Python 2.4 的 RHEL 5 上不起作用。除了 OS X,它不会出错,但也不会更改权限。任何想法为什么?另外,writestr() 是如何工作的?我知道我在这里使用不正确。

有没有办法在没有 os.chmod 的情况下执行此操作(提取文件的用户在提取文件后无权使用 os.chmod)?我拥有对 zip 文件的完全写入权限。

更多信息:

> ls -l test.zip
-rwxrwxrwx 1 myuser mygroup 2008-11-11 13:24 test.zip
> unzip test.zip
Archive:  test.zip
  inflating: test.txt 
> ls -l test.txt
-rw-r--r-- 1 myuser mygroup 2008-11-11 13:34 test.txt

提取的用户不是myuser,而是在mygroup中。

最佳答案

我遇到了与您类似的问题,所以这是我的东西中的代码 spinet,我相信这应该对您有所帮助。

# extract all of the zip
for file in zf.filelist:
    name = file.filename
    perm = ((file.external_attr >> 16L) & 0777)
    if name.endswith('/'):
        outfile = os.path.join(dir, name)
        os.mkdir(outfile, perm)
    else:
        outfile = os.path.join(dir, name)
        fh = os.open(outfile, os.O_CREAT | os.O_WRONLY , perm)
        os.write(fh, zf.read(name))
        os.close(fh)
    print "Extracting: " + outfile

您可以做类似的事情,但插入您自己的逻辑来计算您的烫发值。我应该注意,我在这里使用的是 Python 2.5,我知道与某些版本的 Python 的 zipfile 支持存在一些不兼容性。

关于python - 在python中设置对压缩文件的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/279945/

相关文章:

python - 如何将来自Python中多个线程的同时数据写入csv文件

.net - System.IO.Compression和ZipFile-提取并覆盖

linux - 非 root 用户解压缩文件时是否可以保留 setgid 位?

c# - 如何从文件字节开始在内存中创建一个 zip 文件?

C#如何杀死一个阻塞的线程?

python - Jinja2 异常处理

python - 为什么我不能在 Python 中 pickle 错误的 Traceback?

python - 通过按下另一个屏幕中的按钮来更改 Kivy 按钮小部件属性

Python urllib2响应404错误但url可以打开

java - 在 Java 中提取 zip 存档中的文件时出错