我正在稍微修改我前一段時間撰寫的舊函式以生成報告。最初,生成的報告被路由到指定的路徑供用戶提取,但我決定嘗試為用戶提供在請求點也下載報告的選項(通過合并 send_file)。因此,下面的代碼塊。
展品A
@VVV.route("/reports/users")
def users_report():
if not session.get("logged_in"):
return render_template("login.html")
else:
suffix = datetime.now()
suffix2 = str(suffix)
suffix3 = suffix2.split(" ")
suffix4 = suffix.strftime('%H%M%S')
with open(r'<path>\tahnreports_sysusers_%s_%s.csv' %(suffix3[0],suffix4), 'w', newline='') as start_key:
#newline parameter avoids the extra line space between rows in the csv.
csv_header = ("WID", "F_NAME", "L_NAME", "ORG_ROLE", "ORG_STATUS", "SYS_LOGIN_ID")
csv_out_01 = csv.writer(start_key)
csv_out_01.writerow(csv_header)
x15 = divo.session.query(pearl.work_id, pearl.user_fname, pearl.user_lname, pearl.user_category, pearl.user_status,
pearl.login_id)
for i in x15:
csv_out_02 = csv.writer(start_key)
csv_out_02.writerow(i)
AAA = (r'<path>\tahnreports_sysusers_%s_%s.csv' %(suffix3[0],suffix4))
return send_file(AAA, as_attachment=True)
展品B:
@VVV.route("/reports/users")
def users_report():
if not session.get("logged_in"):
return render_template("login.html")
else:
suffix = datetime.now()
suffix2 = str(suffix)
suffix3 = suffix2.split(" ")
suffix4 = suffix.strftime('%H%M%S')
with open(r'<path>\tahnreports_sysusers_%s_%s.csv' %(suffix3[0],suffix4), 'w', newline='') as start_key:
#newline parameter avoids the extra line space between rows in the csv.
csv_header = ("WID", "F_NAME", "L_NAME", "ORG_ROLE", "ORG_STATUS", "SYS_LOGIN_ID")
csv_out_01 = csv.writer(start_key)
csv_out_01.writerow(csv_header)
x15 = divo.session.query(pearl.work_id, pearl.user_fname, pearl.user_lname, pearl.user_category, pearl.user_status,
pearl.login_id)
for i in x15:
csv_out_02 = csv.writer(start_key)
csv_out_02.writerow(i)
AAA = (r'<path>\tahnreports_sysusers_%s_%s.csv' %(suffix3[0],suffix4))
return send_file(AAA, as_attachment=True)
我的問題是試圖理解為什么這兩個代碼塊的行為不同。下面的兩個函式是相同的,除了一個小的區別——return 陳述句的縮進。雖然它們都生成 AND 也提示用戶下載報告,但 Exhibit_A 有時會生成一個空檔案,而 Exhibit_B 總是生成真實的報告。我認為這與 return 陳述句的縮進有關,但我似乎無法完全掌握它。
進一步說明問題。我使用這兩個函式分別生成了 10 次報告。Exhibit_A 生成了 10 個報告中的 8 個,其中 2 個是空白檔案,而 Exhibit_B 生成了 10 個中的 10 個。除了來自 Exhibit_A 的 2 個空白檔案之外,兩個函式的報告看起來完好無損。我很想就 Exhibit_A 的奇怪行為提供一些反饋。
附錄:Exhibit_B 可能是最佳實踐,但我的想法是 Exhibit_A 應該也能作業,因為“AAA”變數在“for-loop 序列”之外,而且它確實有效——但并非總是如此。反饋表示贊賞。謝謝。


uj5u.com熱心網友回復:
在 A 中,您send_file在with背景關系中呼叫,這意味著檔案仍處于打開狀態以進行寫入,并且可能尚未重繪 到磁盤(或可讀)。
在 B 中,with在呼叫send_file.
(編輯)FWIW,這里是我如何清理它以提高可讀性——由 增加的額外縮進級別else使得with更難以發現微妙之處,并且所有額外的變數也無濟于事。乍一看,我什至不知道您發送的檔案send_file與您正在撰寫的檔案相同,因為構建檔案路徑的運算式既過于復雜,又在兩個地方復制 粘貼。為每一行使用不同的作者也令人困惑——我認為這沒有任何傷害,但我認為它也不會增加任何好處。
@VVV.route("/reports/users")
def users_report():
if not session.get("logged_in"):
return render_template("login.html")
output_path = (
r'<path>\tahnreports_sysusers_%s.csv'
% datetime.now().strftime('%Y-%m-%d_%H%M%S')
)
with open(output_path, 'w', newline='') as file:
csv_out = csv.writer(file)
csv_out.writerow((
"WID",
"F_NAME",
"L_NAME",
"ORG_ROLE",
"ORG_STATUS",
"SYS_LOGIN_ID"
)) # header
csv_out.writerows(divo.session.query(
pearl.work_id,
pearl.user_fname,
pearl.user_lname,
pearl.user_category,
pearl.user_status,
pearl.login_id
)) # data
return send_file(output_path, as_attachment=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/400411.html
標籤:Python 烧瓶 sqlalchemy 导出到 csv
