web-dev-qa-db-ja.com

パスワードで保護されたZipファイルを作成するPython

次のコードを使用して、ユーザーがアップロードしたファイルから、zipFileを使用してPython34アプリケーションでパスワードで保護されたZipファイルを作成しています。しかし、WindowsからZipファイルを開くと、パスワードを要求されません。後でpythonからZipファイルを読み取るために同じパスワードを使用します。何が間違っているのですか?

これが私のコードです:

pwdZipFilePath = uploadFilePath + "encryptedZipFiles/"
filePath = uploadFilePath

if not os.path.exists(pwdZipFilePath):        
      os.makedirs(pwdZipFilePath)

#save csv file to a path
fd, filePath = tempfile.mkstemp(suffix=source.name, dir=filePath)

with open(filePath, 'wb') as dest:
    shutil.copyfileobj(source, dest)

#convert that csv to Zip
fd, pwdZipFilePath = tempfile.mkstemp(suffix=source.name + ".Zip", dir=pwdZipFilePath)

with zipfile.ZipFile(pwdZipFilePath, 'w') as myzip:
    myzip.write(filePath)

    myzip.setpassword(b"tipi")
4
Tahreem Iqbal

zipfileのドキュメントZipFile.setpassword「暗号化されたファイルを抽出するためのデフォルトのパスワード」を設定します。

ドキュメントの最上部:「Zipアーカイブ内の暗号化されたファイルの復号化をサポートしていますが、現在、暗号化されたファイルを作成することはできません。」

編集:パスワードで保護されたZipファイルを作成するには、 pyminizip のようなパッケージを試してください。

7
Galen

組み込みのzipfileモジュールは、パスワードで暗号化されたファイルの書き込みをサポートしていません(読み取りのみ)。 pyminizipを使用することもできます。

import pyminizip
pyminizip.compress("dummy.txt", "myzip.Zip", "noneshallpass", compression_level)

または、Windows/msysgitを使用していて、形式にとらわれない場合:

import os
os.system('tar cz dummy.txt | openssl enc -aes-256-cbc -e -k noneshallpass > mypacked.enc')
os.remove('dummy.txt')
os.system('openssl enc -aes-256-cbc -d -k noneshallpass -in mypacked.enc | tar xz')
6
Jonas Byström