Установить права доступа к сжатому файлу в Python

У меня есть файл test.txt, который находится внутри zip-архива test.zip. Разрешения на test.txt находятся вне моего контроля, когда он сжат, но теперь я хочу, чтобы они были доступны для групповой записи. Я извлекаю файл с помощью Python и не хочу уходить в оболочку.

Обновлено: Вот что у меня есть на данный момент:

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()

Это отлично работает в OS X с использованием 2.5.1, но не работает в моем домашнем компьютере (Debian, Python 2.4 и 2.5) или в RHEL 5 с Python 2.4. Ни на чем, кроме 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, так как кто-то здесь может помочь, но вы не дали ничего, чтобы продолжить.

John Fouhy 11.11.2008 07:20

Не уверен, что вы имеете в виду. Linux ведет себя нормально, хотя Python ведет себя по-другому в OS X.

Harley Holcombe 11.11.2008 07:40

Ну, вы сказали: «Это работает в OS X, а не в Debian». Если вы сказали, почему это не работает, возможно, разместили какой-то код или сообщения об ошибках, кто-то может помочь. Просто мысль.

John Fouhy 11.11.2008 07:44

А, я понимаю, что вы имеете в виду. Сегодня мозг не работает должным образом.

Harley Holcombe 11.11.2008 08:16

Пользователь может разархивировать, но не может os.chmod? звучит странно.

orip 14.11.2008 01:57

Да, они могут писать в каталог, но файл внутри zip-архива не доступен для групповой записи. Странная ситуация.

Harley Holcombe 17.11.2008 07:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
6
4 782
3

Ответы 3

Согласно документации, unzip устанавливает разрешения для тех, которые хранятся в unix. Также не используется оболочка umask. Лучше всего убедиться, что завивки установлены, прежде чем архивировать файл.

Поскольку вы не можете этого сделать, вам придется попробовать сделать то, что вы пытались сделать (и заставить это работать под Debian.)

С библиотекой zipfile Pythons возник ряд проблем, в том числе установка режима Writestr для файла, записываемого в некоторых системах, или установка zip systm на windows вместо unix. Таким образом, ваши противоречивые результаты могут означать, что ничего не изменилось.

Так что, возможно, вам совсем не повезло.

Распаковать в стандартный вывод (распаковать -p) и перенаправить в файл? Если в ZIP-архиве более одного файла, вы можете перечислить их содержимое, а затем извлекать их по одному.

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

(да, я знаю, что вы пометили этот «питон» :-))

У меня была аналогичная проблема с вами, поэтому вот код из моих материалов, я считаю, что это должно помочь здесь.

# 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, я знаю о некоторых несовместимости с некоторыми версиями поддержки zip-файлов Python.

Другие вопросы по теме