随着tempfile https://docs.python.org/3.8/library/tempfile.html- 可以创建模块临时文件,关闭或离开时自动删除这些文件with https://docs.python.org/3/reference/compound_stmts.html#with-堵塞。随着pyminizip https://pypi.org/project/pyminizip/- 可以获得模块加密的zip文件。
pyminizip.compress
期望第三个参数是生成的 zip 文件的保存路径。如果文件已存在,则会尝试覆盖它。当前代码使用对临时文件的引用(tmp
),这会导致观察到的错误消息:
ValueError: expected arguments are compress(src, srcpath, dst, pass, level)
错误的直接原因是使用了引用本身而不是其文件名,即为了避免错误,tmp.name
实际上应该使用而不是tmp
。但是,如果更改此设置,则会生成不同的错误消息,即
OSError: error in closing <path to temo file> (-102)
这是因为 pyminizip-module 尝试在临时文件仍打开时删除它。如果之前关闭了临时文件,它将被覆盖,并且不会出现错误消息。但是,这只会创建一个普通文件,而不是临时文件,即该文件不会被删除自动地当关闭或离开时with
-block.
因此,无法使用 tempfile 和 pyminizip 模块创建临时的加密 zip 文件这样。然而,tempfile-module 允许创建临时文件以及临时目录。与临时文件一样,临时目录在离开时会被删除with
-堵塞。如果删除临时目录,其中包含的文件也会被删除。因此,替代方案是常见的加密 zip 文件(使用 pyminizip 模块创建),它们存储在临时文件夹中(使用 tempfile 模块创建):
...
with tempfile.TemporaryDirectory() as tdir:
sourceFile = <path to file to be zipped>
destinationFile = "destFile.zip"
password = "whatever"
compression_level = 9 # 1-9
pyminizip.compress(sourceFile, None, tdir + "\\" + destinationFile, password, compression_level)
# inside with-block: temp-directory and contained encrypted zip-files exist
...
# outside with-block: temp-directory and contained encrypted zip-files deleted
...
If the with
-block 保留后,临时目录及其包含的任何加密 zip 文件将被删除。
顺便一提:pyminizip.compress
不支持with
-陈述。这会导致错误消息:AttributeError: __enter__
。在当前代码中你看不到这个错误消息,因为发布的错误消息是之前触发的。