You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask返回CSV时遇TypeError: Expected bytes错误的解决方法

问题解决:TypeError: Expected bytes 处理方案

问题原因

  1. 循环逻辑错误:你的循环for row in result: data = row会不断覆盖data变量,最终仅保留数据库返回的最后一行数据,丢失了所有前置行。
  2. 数据格式不匹配:返回text/csv类型的Response时,要求传入CSV格式的字节数据,但你直接传入了数据库返回的行对象(通常是元组或自定义数据类型),不符合字节类型要求,因此触发TypeError。

修复方案

使用Python内置的csv模块将数据库数据转换为标准CSV格式,再编码为字节后传入Response。以下是完整修正代码:

import csv
from io import StringIO
# 确保已导入Response及数据库连接相关模块

cursor = connection.cursor()
cursor.execute("select * from table")
result = cursor.fetchall()
# 可选:获取数据库表字段名作为CSV表头
headers = [desc[0] for desc in cursor.description]
connection.close()

# 内存中生成CSV内容
output_buffer = StringIO()
csv_writer = csv.writer(output_buffer)
# 写入表头(不需要的话可删除此行)
csv_writer.writerow(headers)
# 批量写入所有数据行
csv_writer.writerows(result)

# 将CSV字符串编码为字节
csv_bytes = output_buffer.getvalue().encode('utf-8')

return Response(
    csv_bytes,
    mimetype="text/csv",
    headers={
        "Content-disposition": "attachment; filename=data.csv"
    },
)

关键修改说明

  • 用csv.writerows(result)替代循环赋值,一次性写入所有数据行,避免数据丢失。
  • 借助StringIO在内存中生成CSV格式字符串,再通过encode('utf-8')转换为字节流,满足Response对数据类型的要求。
  • 可选通过cursor.description获取表字段名作为CSV表头,提升导出文件的可读性。

内容的提问来源于stack exchange,提问作者Jim Macaulay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:07:39