Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> встроенный архиватор в Python-е, переносимые модули 
:(
    Опции темы
pythonwin
Дата 21.4.2006, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Если встроенный архиватор в Python-е?

Нужно заархивировать папку, но это желательно сделать не через winrar или tar, а при помощи встроенного переносимого модуля в Python-е.

Нашел модуль gzip, но это не то, - используя его можно только "сжимать" строки и записывать их в файл, а вот архивировать файлы и папки - нельзя.
-----------------------
import gzip
gz1=gzip.GzipFile(filename='c:\\f1.gz', mode='wb', compresslevel=9)
gz1.write(str(range(10**6)))
gz1.close()
f.close()
------------------------- 
PM WWW GTalk Jabber   Вверх
SAnty
Дата 21.4.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.2.2006

Репутация: 3
Всего: 5



В принцыпе  есть ещё объект zipfile. Работать с ним просто.

Из описания в книге:
Этот модуль доступен, начиная с версии 1.6, и позволяет записывать и читать zip-
архивы.


ZipFile(filename [, mode [, compression]])
Возвращает объект, реализующий автоматическую упаковку/распаковку при чте-
нии/записи файла с именем filename. Аргумент mode может иметь одно из
трех значений: 'r' (чтение), 'w' (запись в новый архив) или 'a' (добавление
к существующему архиву). По умолчанию используется 'r'. В качестве аргу-
мента compression может быть использована одна из приведенных ниже кон-
стант, при попытке использования недоступного метода генерируется исключение
RuntimeError.

В настоящий момент модуль поддерживает только два метода сжатия (аргумент
compression конструктора ZipFile):
ZIP_STORED
Упаковка данных без сжатия (используется по умолчанию).
ZIP_DEFLATED
Наиболее часто используемый в zip-файлах метод сжатия. Этот метод требует
наличия модуля zlib.
Экземпляры классов ZipFile и PyZipFile имеют следующие атрибуты данных
и методы:
namelist()
Возвращает список имен файлов, содержащихся в архиве.
infolist()
Возвращает список экземпляров класса ZipInfo, представляющих описание фай-
лов, содержащихся в архиве.
338 Глава 24. Сжатие данных
printdir()
Выводит в стандартный поток вывода (sys.stdout) оглавление архива.
testzip()
Считывает все файлы архива и проверяет для них контрольные суммы. Возвращает
имя первого файла, для которого контрольная сумма не сходится или None, если
тест прошел успешно.
getinfo(name)
Возвращает экземпляр класса ZipInfo, представляющий описание файла name.
read(name)
Считывает файл с именем name из архива и возвращает его содержимое в виде
строки.
write(filename [, arcname [, compress_type]])
Помещает файл с именем filename в архив под именем arcname (по умолча-
нию используется имя исходного файла) используя метод compress_type (по
умолчанию используется метод, указанный при инициализации экземпляра).
writestr(zinfo, bytes)
Помещает файл в архив. В качестве содержимого файла используется аргумент
bytes, информация об имени файла, времени его создания, методе сжатия и т. д.
берется из объекта zinfo, который должен быть экземпляром класса ZipInfo.
close()
Закрывает файл (если архив был открыт для записи, дописывает завершающую
запись). 
PM MAIL WWW   Вверх
SAnty
Дата 21.4.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.2.2006

Репутация: 3
Всего: 5



Примеры можна посмотреть здесь:

http://aspn.activestate.com/ASPN/search/se...s?query=zipfile 
PM MAIL WWW   Вверх
pythonwin
Дата 21.4.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Ура меня услышали!!!

Написал скрипт:
--------------------------------
import gzip, zipfile, zlib
gz1=zipfile.ZipFile ('c:\\test.zip', 'w', 8)
gz1.write('c:\\zf.py', None, 8)
gz1.close()
gz1=zipfile.ZipFile ('c:\\test1.zip', 'w', 8)
gz1.write('c:\\test.zip', None, 8)
gz1.close()
gz1=zipfile.ZipFile ('c:\\test2.zip', 'w', 8)
gz1.write('c:\\test1.zip', None, 8)
gz1.close()
---------------------------------

Но при этом добился того, что с ТРЕХ оперций смог заархивировать текстовый файл размером в "7 888 896 байт" до "40 960 байт", вот при ОДНОМ сжатии winrar-ом сжал этот же файл до "32 768 байт"

Вопрос - что изменить в скрипте, для того, чтобы сжимать по максимуму? 
PM WWW GTalk Jabber   Вверх
SAnty
Дата 21.4.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.2.2006

Репутация: 3
Всего: 5



Кажется нет.

Можна ещё попробовать tarfile: (Там есть возможность использовать разные типы компресии gz, bz2)

пример:

import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in namelist:
    tarinfo = tar.gettarinfo(name, "fakeproj-1.0/" + name)
    tarinfo.uid = 123
    tarinfo.gid = 456
    tarinfo.uname = "johndoe"
    tarinfo.gname = "fake"
    tar.addfile(tarinfo, file(name))
tar.close()

 
PM MAIL WWW   Вверх
pythonwin
Дата 21.4.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Класно! только не понял как выставлять уровень сжатия. 
PM WWW GTalk Jabber   Вверх
SAnty
Дата 21.4.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.2.2006

Репутация: 3
Всего: 5



Все объекты мспользуют модуль zlib и опция компресии идёт по умолчанию 9, максимальная компресия, минимальная скорость. 
PM MAIL WWW   Вверх
pythonwin
Дата 25.4.2006, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



А алгоритм rar как-то можно "достать" или "подключить"?

Добавлено @ 06:53 
Скажите: Зачем?

Мне нужен быстрый (не столь критично), эффективный (минимум ресурсов) архиватор на питоне, но главное, что бы он сжимал максимально! 
PM WWW GTalk Jabber   Вверх
J2A
Дата 28.4.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



pythonwin: 15 сек гугления по запросам "python bz2", "python rar" и "python lzma" приводят к:
http://labix.org/python-bz2
http://www.averdevelopment.com/python/UnRAR.html
http://www.joachim-bauch.de/projects/python/pylzma/

Скажешь: а почему rar только разархивирование? 
Отвечу: потому что он закрытый.  

Это сообщение отредактировал(а) J2A - 28.4.2006, 15:54
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
pythonwin
Дата 4.5.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Спасибо! Сейчас этим и занимаюсь!

Добавлено @ 10:11 
Сейчас играюсь с 7-zip (http://www.joachim-bauch.de/projects/python/pylzma/) , правда эта библиотека позволяет сжимать только ОДИН файл, а не создавать архив из нескольких файлов.

Если у кого-нибудь есть какие-нибудь предложения - буду рад! smile  
PM WWW GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0949 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.