![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 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() ------------------------- |
|||
|
||||
SAnty |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 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() Закрывает файл (если архив был открыт для записи, дописывает завершающую запись). |
|||
|
||||
SAnty |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 16.2.2006 Репутация: 3 Всего: 5 |
||||
|
||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 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 байт" Вопрос - что изменить в скрипте, для того, чтобы сжимать по максимуму? |
|||
|
||||
SAnty |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 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() |
|||
|
||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
Класно! только не понял как выставлять уровень сжатия.
|
|||
|
||||
SAnty |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 16.2.2006 Репутация: 3 Всего: 5 |
Все объекты мспользуют модуль zlib и опция компресии идёт по умолчанию 9, максимальная компресия, минимальная скорость.
|
|||
|
||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
А алгоритм rar как-то можно "достать" или "подключить"?
Добавлено @ 06:53 Скажите: Зачем? Мне нужен быстрый (не столь критично), эффективный (минимум ресурсов) архиватор на питоне, но главное, что бы он сжимал максимально! |
|||
|
||||
J2A |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
Спасибо! Сейчас этим и занимаюсь!
Добавлено @ 10:11 Сейчас играюсь с 7-zip (http://www.joachim-bauch.de/projects/python/pylzma/) , правда эта библиотека позволяет сжимать только ОДИН файл, а не создавать архив из нескольких файлов. Если у кого-нибудь есть какие-нибудь предложения - буду рад! ![]() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |