Установка разрешений для сжатого файла в python

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

EDIT: Вот что я получил до сих пор:

 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 .

3 Solutions collect form web for “Установка разрешений для сжатого файла в python”

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

 # 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 

Вы можете сделать что-то подобное, но вставьте свою собственную логику для вычисления своего значения perm. Я должен отметить, что я использую Python 2.5 здесь, я знаю несколько несовместимостей с некоторыми версиями поддержки zipfile Python.

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

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

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

Так что вам может быть совершенно не повезло.

Извлечь в stdout (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» :-))

  • Python - извлечение файлов из большого (6GB +) zip-файла
  • Python zip подпапку, а не весь путь к папке
  • искать () файл в zip-файле в Python, не передавая его в память
  • Как установить разрешения (атрибуты) в файле в ZIP-файле с помощью zipfile-модуля Python?
  • Python zipfile весь путь находится в файле
  • Безопасное извлечение zip или tar с помощью Python
  • Как распаковать файл с помощью Python 2.4?
  • zipfile не может обрабатывать данные типа zip?
  • Смутно о создании CSV-файла в ZIP-файл в django
  • Модуль zipfile python, похоже, не сжимает мои файлы
  • Найти и заменить текст в файле .docx - Python
  • Python - лучший язык программирования в мире.