开发者社区> 问答> 正文

如何将CSV文件附加到Python中现有的zip归档文件中?

我正在调用一个返回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

展开
收起
kun坤 2019-12-29 21:33:09 604 0
1 条回答
写回答
取消 提交回答
  • 从第一眼看上去

    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文件,代码将会简单得多。保存在磁盘上的文件。

    2019-12-29 21:33:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载