Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 2, 2008 20:41:39

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

# -*- coding: utf-8 -*-
import codecs, sys
sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
import zipfile
f = zipfile.ZipFile('C:\\Temp\\test.zip', 'w', zipfile.ZIP_DEFLATED)
f.write(u'C:\\Temp\\Папочка\\Имечко файла на русском.doc'.encode('cp1251'))
f.close()
Сразу несколько вопросов:
1. Файл упаковывается, но при просмотре в WinRAR - в имени и пути файла кракозябры. Как избежать?
2. В архив попаждает вся иерархия папок в пути (Temp\Папочка), а мне это не нужно, нужен только сам файл.
3. Как упаковать каталог со всем вложенным в него барахлом, рекурсивно? (без тупого перебора и упаковки по одному файлу)
Спасибо.



Офлайн

#2 Янв. 2, 2008 21:24:46

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

привет, попробую ответить по-порядку, сам недавно только с зипом ковырялся:
1.

# -*- coding: utf-8 -*-
nameA = name.decode ("utf-8").encode ("cp866")
zipObj = zipfile.ZipFile(archName,'a',zipfile.ZIP_DEFLATED)
zipObj.write(name,nameA,None)
2. Чтобы не попадали все папки, я пользуюсь
os.chdir (sourceF)
3. На сколько мне известно - нет, по крайней мере, я не находил такой возможности, если я не прав - поправьте, буду только рад :)



Отредактировано (Дек. 11, 2009 22:35:19)

Офлайн

#3 Янв. 2, 2008 22:07:02

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

Большое спасибо! Первые два вопроса решены:

# -*- coding: utf-8 -*-
import zipfile
arch = u'C:\\Temp\\файл архива.zip'
f = zipfile.ZipFile(arch, 'w', zipfile.ZIP_DEFLATED)
name = u'C:\\Temp\\Папка\\имя файла.txt'
nameA = u'Путь в архиве задаётся как угодно\\имя файла в архиве.txt'.encode('cp866')
f.write(name, nameA)
f.close()
По первому вопросу: как оказалось, явного вызова decode не требуется, достаточно просто u'строка'.
По второму вопросу: как оказалось, путь в архиве можно указывать произвольно, поэтому смены каталога тоже не нужно.
Осталось решить третий вопрос ;).



Офлайн

#4 Янв. 2, 2008 23:16:04

Lolka
От:
Зарегистрирован: 2007-09-29
Сообщения: 128
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

Рекурсивно это как раз таки и обойти все вложенные каталоги и запаковать все файлы :)



Офлайн

#5 Янв. 2, 2008 23:39:41

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

The gray Cardinal
Большое спасибо! Первые два вопроса решены:
# -*- coding: utf-8 -*-
import zipfile
arch = u'C:\\Temp\\файл архива.zip'
f = zipfile.ZipFile(arch, 'w', zipfile.ZIP_DEFLATED)
name = u'C:\\Temp\\Папка\\имя файла.txt'
nameA = u'Путь в архиве задаётся как угодно\\имя файла в архиве.txt'.encode('cp866')
f.write(name, nameA)
f.close()
По первому вопросу: как оказалось, явного вызова decode не требуется, достаточно просто u'строка'.
По второму вопросу: как оказалось, путь в архиве можно указывать произвольно, поэтому смены каталога тоже не нужно.
Осталось решить третий вопрос ;).
decode использовал, так как путь из текстовика выхватывал, а вот по поводу того, что путь архивов самому в архиве прописывать можно - не подумал :)



Офлайн

#6 Янв. 3, 2008 00:06:18

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

Lolka
Рекурсивно это как раз таки и обойти все вложенные каталоги и запаковать все файлы
Ну почему же? Рекурсивно - это когда вместо write('путь к файлу') можно написать что-то вроде writeRecursively('путь к каталогу') :lol:. Впрочем, как оказалось, использовать os.walk в данном случае тоже несложно.



Офлайн

#7 Янв. 3, 2008 00:23:57

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

Итоги своих изысканий зафиксировал здесь:
http://forum.script-coding.info/viewtopic.php?id=1009
Если что не так, прошу высказываться.



Офлайн

#8 Янв. 5, 2008 12:59:55

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

The gray Cardinal как я понимаю zipfile работает как pickle-файл - особенно на разархивирование - большая проблема, когда в архиве большие файлы - просто может ОЗУ не хватить.



Офлайн

#9 Янв. 5, 2008 14:14:41

The gray Cardinal
От:
Зарегистрирован: 2007-03-07
Сообщения: 422
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

pythonwin
как я понимаю zipfile работает как pickle-файл - особенно на разархивирование - большая проблема, когда в архиве большие файлы - просто может ОЗУ не хватить.
А какие есть варианты для таких случаев?



Офлайн

#10 Янв. 23, 2008 10:41:51

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Модуль zipfile, кодировки и пути

разархивировать через unzip



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version