我有一个文件 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/