如何使用 Python 修改 ZIP 文件内的文件

Python 提供 zipfile 模块来读写 ZIP 文件。我们之前的文章 Python 示例:列出 ZIP 归档中的文件使用 Python 在内存中下载和读取 ZIP 文件 展示了如何列出和读取 ZIP 文件内的文件。

在此示例中,我们将展示如何将文件从一个 ZIP 文件复制到另一个并在过程中修改其中一个文件。如果你想使用 ODT 或 LBX 等 ZIP 文件格式作为模板,替换文件的部分文本内容,这通常很有用。

modify_zip.py
import zipfile

with zipfile.ZipFile(srcfile) as inzip, zipfile.ZipFile(dstfile, "w") as outzip:
    # 迭代输入文件
    for inzipinfo in inzip.infolist():
        # 读取输入文件
        with inzip.open(inzipinfo) as infile:
            if inzipinfo.filename == "test.txt":
                content = infile.read()
                # 通过替换字符串修改文件内容
                content = content.replace("abc", "123")
                # 写入内容
                outzip.writestr(inzipinfo.filename, content)
            else: # 其他文件,不想修改 => 直接复制

使用以下命令打开输入文件和输出 ZIP 后

modify_zip.py
with zipfile.ZipFile(srcfile) as inzip, zipfile.ZipFile(dstfile, "w") as outzip:

我们遍历输入 ZIP 文件中的所有文件:

modify_zip.py
for inzipinfo in inzip.infolist():

如果我们遇到了要修改的文件,由其文件名 test.txt 标识:

modify_zip.py
if inzipinfo.filename == "test.txt":

我们读取并修改内容…

modify_zip.py
with inzip.open(inzipinfo) as infile:
    content = infile.read().replace("abc", "123")

…并将修改后的内容写入输出 ZIP:

modify_zip.py
outzip.writestr("test.txt", content)

否则,如果当前文件不是我们要修改的文件,我们只需使用以下命令将文件复制到输出 ZIP

modify_zip.py
outzip.writestr(inzipinfo.filename, infile.read())

注意该算法始终从输入 ZIP .read() 文件,因此其整个内容将临时存储在内存中。因此,它不适用于解压后较大的文件。


Check out similar posts by category: Python