Я создаю ZIP-файл с ZipFile в Python 2.5, пока он работает нормально:
import zipfile, os
locfile = "test.txt"
loczip = os.path.splitext (locfile)[0] + ".zip"
zip = zipfile.ZipFile (loczip, "w")
zip.write (locfile)
zip.close()
но я не мог найти, как зашифровать файлы в файле ZIP. Я мог бы использовать system и вызывать PKZIP -s, но я полагаю, что должен быть более "Pythonic" способ. Я ищу решение с открытым исходным кодом.
Вы можете использовать библиотеку Chilkat . Он коммерческий, но имеет бесплатную оценку и выглядит довольно мило.
Вот пример, который я получил отсюда :
import chilkat
# Demonstrates how to create a WinZip-compatible 128-bit AES strong encrypted zip
zip = chilkat.CkZip()
zip.UnlockComponent("anything for 30-day trial")
zip.NewZip("strongEncrypted.zip")
# Set the Encryption property = 4, which indicates WinZip compatible AES encryption.
zip.put_Encryption(4)
# The key length can be 128, 192, or 256.
zip.put_EncryptKeyLength(128)
zip.SetPassword("secret")
zip.AppendFiles("exampleData/*",True)
zip.WriteZip()
Я создал простую библиотеку для создания зашифрованного паролем zip-файла в python. - здесь
import pyminizip
compression_level = 5 # 1-9
pyminizip.compress("src.txt", "dst.zip", "password", compression_level)
Библиотека требует zlib.
Я проверил, что файл может быть извлечен в WINDOWS / MAC.
Двойной вопрос https://stackoverflow.com/a/2366917/874188 рекомендует использовать 7z
вместо zip
. Мой опыт подтверждает это.
Скопируйте / вставьте ответ @JFSebastian здесь также для полноты:
Чтобы создать зашифрованный zip-архив (именованный 'myarchive.zip'
) с помощью 7-Zip
утилиты с открытым исходным кодом :
rc = subprocess.call(['7z', 'a', '-mem=AES256', '-pP4$$W0rd', '-y', 'myarchive.zip'] +
['first_file.txt', 'second.file'])
Чтобы установить 7-Zip, введите:
$ sudo apt-get install p7zip-full
Чтобы разархивировать вручную (чтобы продемонстрировать совместимость с утилитой zip), введите:
$ unzip myarchive.zip
И введите P4$$W0rd
в подсказку.
Или то же самое в Python 2.6+:
>>> zipfile.ZipFile('myarchive.zip').extractall(pwd='P4$$W0rd')
Ответ @ tripleee помог мне, см. мой тест ниже.
Этот код работает для меня на Python 3.5.2 на Windows 8.1 ( путь 7z добавлен в систему).
rc = subprocess.call(['7z', 'a', output_filename + '.zip', '-mx9', '-pSecret^)'] + [src_folder + '/'])
С двумя параметрами:
-mx9
означает максимальное сжатие-pSecret^)
значит пароль естьSecret^)
.^
это escape для)
ОС Windows, но когда вы разархивируете, нужно будет ввести^
.
Без ^
Windows ОС не будет применять пароль при создании 7z.exe файла zip .
Кроме того, если вы хотите использовать -mhe
переключатель, вам понадобится формат файла 7z вместо zip .
Я надеюсь, что это может помочь.
pyminizip
прекрасно работает при создании защищенного паролем zip-файла. Для разархивирования в некоторых ситуациях происходит сбой. Проверено на Python 3.7.3
Здесь я использовал pyminizip для шифрования файла.
import pyminizip
compression_level = 5 # 1-9
pyminizip.compress("src.txt",'src', "dst.zip", "password", compression_level)
Для распаковки я использовал модуль zip-файла:
from zipfile import ZipFile
with ZipFile('/home/paulsteven/dst.zip') as zf:
zf.extractall(pwd=b'password')