我正在调用一个返回zip文件的API。在将其发送到客户端进行下载之前,我想附加一个我正在创建的csv文件到它。下面是我如何创建CSV和我的附加尝试,但我得到的似乎是一个无穷无尽的嵌套zip文件,不断附加数字2到文件名。似乎Mac OS在不停地把zip文件转换成cpgz文件,然后再转换回来。如果我尝试对这个文件运行解压缩,我得到以下错误 在内存中生成CSV的代码
transactions_csv = io.StringIO()
writer = csv.DictWriter(transactions_csv, fieldnames=all_parsed_transactions[0].keys())
writer.writeheader()
for transaction in all_parsed_transactions:
writer.writerow(transaction)
return transactions_csv
试图附加到现有zip中的代码
export = io.ByesIO(request.export_data()) #This is a zip response
transaction_csv = request.export_transactions() #This calls the code above
if transaction_csv is not None and export is not None:
new_zip = zipfile.ZipFile(export, "a", zipfile.ZIP_DEFLATED)
new_zip.write("test.csv", transaction_csv.getvalue())
new_zip.close()
return HttpResponse(new_zip, content_type='application/zip')
问题来源StackOverflow 地址:/questions/59379915/how-can-i-append-a-csv-file-to-an-existing-zip-archive-in-python
从第一眼看上去
export = request.export_data()
返回的字节数据。ZipFile只对类似文件的对象有效,你能不能试着用下面的代码把它封装起来:
export = io.BytesIO(request.export_data())
export.seek(0) # this sets cursor to the beginning of file
# I had some issues with cursors not being at the beginning of the file
# and thus data read from it was corrupt.
UPD:实际上问题比我描述的要多。我很快就回来。 以下是完整的工作示例:
import csv
import io
import zipfile
transactions = [
{"f1": 1, "f2": 2, "f3": 3},
{"f1": 3, "f2": 1, "f3": 2},
{"f1": 2, "f2": 3, "f3": 1},
]
transactions_csv = io.StringIO()
writer = csv.DictWriter(transactions_csv, fieldnames=["f1", "f2", "f3"])
writer.writeheader()
for transaction in transactions:
writer.writerow(transaction)
transactions_csv.seek(0)
with open("file.zip", "r+b") as z:
new_zip = zipfile.ZipFile(z, "a", zipfile.ZIP_DEFLATED, False)
new_zip.writestr("transaction3.csv", transactions_csv.read())
new_zip.close()
注意:我在任何地方都使用类似文件的对象,假设这是主要问题之一。如果您有zip文件,代码将会简单得多。保存在磁盘上的文件。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。