Найти - Пользователи
Полная версия: Модуль zipfile, кодировки и пути
Начало » Python для экспертов » Модуль zipfile, кодировки и пути
1 2 3
The gray Cardinal
# -*- 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. Как упаковать каталог со всем вложенным в него барахлом, рекурсивно? (без тупого перебора и упаковки по одному файлу)
Спасибо.
well
привет, попробую ответить по-порядку, сам недавно только с зипом ковырялся:
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. На сколько мне известно - нет, по крайней мере, я не находил такой возможности, если я не прав - поправьте, буду только рад :)
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'строка'.
По второму вопросу: как оказалось, путь в архиве можно указывать произвольно, поэтому смены каталога тоже не нужно.
Осталось решить третий вопрос ;).
Lolka
Рекурсивно это как раз таки и обойти все вложенные каталоги и запаковать все файлы :)
well
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 использовал, так как путь из текстовика выхватывал, а вот по поводу того, что путь архивов самому в архиве прописывать можно - не подумал :)
The gray Cardinal
Lolka
Рекурсивно это как раз таки и обойти все вложенные каталоги и запаковать все файлы
Ну почему же? Рекурсивно - это когда вместо write('путь к файлу') можно написать что-то вроде writeRecursively('путь к каталогу') :lol:. Впрочем, как оказалось, использовать os.walk в данном случае тоже несложно.
The gray Cardinal
Итоги своих изысканий зафиксировал здесь:
http://forum.script-coding.info/viewtopic.php?id=1009
Если что не так, прошу высказываться.
pythonwin
The gray Cardinal как я понимаю zipfile работает как pickle-файл - особенно на разархивирование - большая проблема, когда в архиве большие файлы - просто может ОЗУ не хватить.
The gray Cardinal
pythonwin
как я понимаю zipfile работает как pickle-файл - особенно на разархивирование - большая проблема, когда в архиве большие файлы - просто может ОЗУ не хватить.
А какие есть варианты для таких случаев?
pythonwin
разархивировать через unzip
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB