如何避免文件内容重复 zipfile

How to avoid file content repetition zipfile

我需要压缩多个 xml 文件,我使用 lxml、zipfile 和 for 循环实现了这一点。

我的问题是,每次我重新 运行 我的函数时,压缩文件的内容都会重复(最后附加)并且越来越长。我认为这与 a+b 的写作模式有关。我认为通过在代码块末尾使用 with open 文件将被删除,并且不会向其中添加更多内容。我错了,使用其他模式我没有得到预期的结果。

这是我的代码:

def compress_package_file(self):
   bytes_buffer = BytesIO()
   with zipfile.ZipFile(bytes_buffer, 'w') as invoices_package:
       i = 1
       for invoice in record.invoice_ids.sorted('sin_number'):
           invoice_file_name = 'Invoice_' + invoice.number + '.xml'
           with open(invoice_file_name, 'a+b') as invoice_file:
               invoice_file.write(invoice._get_invoice_xml().getvalue())
               invoices_package.write(invoice_file_name, compress_type=zipfile.ZIP_DEFLATED)
           i += 1
   compressed_package = bytes_buffer.getvalue()
   encoded_compressed_file = base64.b64encode(compressed_package)               

我的 xml 生成器在另一个函数中并且工作正常。但是每次我运行这个函数时,内容都会重复。例如,如果我 运行 两次,压缩文件中的文件内容如下所示(简化内容):

<?xml version='1.0' encoding='UTF-8'?>
<invoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="invoice.xsd">
    <header>
        <invoiceNumber>9</invoiceNumber>
    </header>
</facturaComputarizadaCompraVenta><?xml version='1.0' encoding='UTF-8'?>
<invoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="invoice.xsd">
    <header>
        <invoiceNumber>9</invoiceNumber>
    </header>
</facturaComputarizadaCompraVenta>

如果我使用w+b模式,文件内容是空白的。 我的代码应该如何避免这种行为?

我建议你使用 w+b 模式,但在关闭发票 XML 文件后将写入移动到 zipfile。

从您写的内容来看,您正在尝试压缩尚未刷新到磁盘的文件,因此使用 w+b 在压缩时它仍然是空的。

因此,请尝试删除 invoices_package.write 行的 1 级缩进(我无法在移动设备上正确格式化代码,因此 post 整个部分也不能)。