目標是在 excel 檔案中將三個 Pandas資料幀(result1,result2和result3)作為三張表回傳,作為對 fastapi 路由的回應。這就是函式結尾的樣子
from fastapi.responses import StreamingResponse
...
with BytesIO() as buffer:
# pylint: disable=abstract-class-instantiated
with pandas.ExcelWriter(path=buffer, engine=XCL_ENGN) as writer:
result1.to_excel(excel_writer=writer, sheet_name='Report 1', index=False)
result2.to_excel(excel_writer=writer, sheet_name='Report 2', index=False)
result3.to_excel(excel_writer=writer, sheet_name='Report 3', index=False)
return StreamingResponse(content=BytesIO(initial_bytes=buffer.getvalue()),
headers=headers)
代碼按預期作業。但是,return 陳述句似乎打開了一個位元組流,該位元組流形成了正在回傳的內容,但從未對其進行操作close()。我嘗試將其包裝在另一個 with 陳述句中,但似乎拋出了一個
ValueError: I/O operation on closed file.
我也嘗試了 contextlib.closure 方法,但同樣的錯誤。那么這里是否有任何資源泄漏以及如何避免它?
此外,似乎當我將資料寫入第一個緩沖區,然后形成另一個位元組流只是為了回傳值(可能基本上復制了所有內容)時效率有點低。有什么方法可以使這部分代碼更干凈、無泄漏、遵守最佳背景關系管理實踐?
uj5u.com熱心網友回復:
正如評論中所討論的,只要可以將 Excel 作業表完全緩沖到記憶體中就可以了,StreamingResponse這里根本沒有必要。
from fastapi.responses import Response
# ...
with BytesIO() as buffer:
with pandas.ExcelWriter(path=buffer, engine=XCL_ENGN) as writer:
result1.to_excel(...)
data = buffer.getvalue()
return Response(content=data, headers=headers)
會做的很好。
如果作業表太大而無法保存在記憶體中,那么一旦寫入回應,您可以使用例如 atempfile.TemporaryFile和后臺任務來處理它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/370000.html
