【问题标题】:Set permissions on a compressed file in python在python中设置压缩文件的权限
【发布时间】:2010-09-21 18:02:07
【问题描述】:

我有一个文件test.txt,它位于压缩档案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 上完美运行,但它不适用于我的 home box(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

【问题讨论】:

  • 您可以做的另一件事是详细说明您在 linux 下遇到的问题,因为这里有人可能会提供帮助,但您没有提供任何帮助。
  • 不确定你的意思。 Linux 表现良好,尽管 python 在 OS X 上表现不同。
  • 嗯,你说“它适用于 OS X,而不是 Debian”。如果您说为什么它不起作用,也许发布了一些代码或错误消息,有人可能会提供帮助。只是一个想法。
  • 啊,我明白你的意思了。今天大脑工作不正常。
  • 用户可以解压,但不能os.chmod?听起来很奇怪。

标签: python zip zipfile


【解决方案1】:

@Petriborg 的回答仍然是相关的,但要使用 Python 3,这里有一个包含必要修复的版本:

import os
import zipfile

zip_file = "/path/to/archive.zip"
out_dir = "/path/to/output"

os.makedirs(out_dir, exist_ok=True)

with zipfile.ZipFile(zip_file, "r") as zf:
    for file in zf.filelist:
        name = file.filename
        perm = ((file.external_attr >> 16) & 0o777)
        print("Extracting: " + name)
        if name.endswith("/"):
            os.mkdir(os.path.join(out_dir, name), perm)
        else:
            outfile = os.path.join(out_dir, name)
            fh = os.open(outfile, os.O_CREAT | os.O_WRONLY, perm)
            os.write(fh, zf.read(name))
            os.close(fh)

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,所以这是我的东西中的代码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 支持的某些版本存在一些不兼容。

    【讨论】:

      【解决方案3】:

      根据文档, unzip 将权限设置为在 unix 下存储的权限。此外,不使用外壳 umask。最好的办法是确保在压缩文件之前设置 perms。

      既然你不能这样做,你将不得不尝试做你想做的事情(并让它在 Debian 下工作。)

      Python 的 zipfile 库存在许多问题,包括将 writestr 的模式设置为某些系统上正在写入的文件的模式,或者将 zip 系统设置为 windows 而不是 unix。所以你不一致的结果可能意味着什么都没有改变。

      所以你可能完全不走运。

      【讨论】:

        【解决方案4】:

        解压到标准输出(unzip -p)并重定向到一个文件?如果 zip 中有多个文件,您可以列出 zip 内容,然后一次提取一个。

        for n in `unzip -l test.zip | awk 'NR > 3 && NF == 4 { print $4 }'`; do unzip -p test.zip $n > $n; done
        

        (是的,我知道你标记了这个“python”:-))

        【讨论】:

          猜你喜欢
          • 2013-07-27
          • 2016-01-29
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 2014-07-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多