如何避免文件内容重复 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 整个部分也不能)。
我需要压缩多个 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 整个部分也不能)。