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

PySpark发送CSV附件邮件异常:CSV内容全部显示在同一行

嘿,我一眼就揪出问题所在了——不是你生成CSV的步骤有问题,而是读取CSV并转换为邮件附件的环节搞砸了!

问题到底出在哪?

你用sc.textFile("/dbfs/<path>/df.csv").collect()读取文件时,得到的是一个列表,每个元素对应CSV里的一行,但这些元素末尾是没有换行符的。然后你用"".join(filedata.collect())把所有行直接拼在了一起,完全没加换行——这就把原本多行的CSV硬生生压缩成了一行,表头和所有数据挤在同一行,可不就变成6万列1行吗?

两种快速修复方案

方案1:拼接时补上换行符

只需要把拼接的代码改成用换行符连接每行内容就行:

part = MIMEApplication("\n".join(filedata.collect()), Name="df.csv")

方案2:用Python本地文件读取(更推荐)

既然文件已经存在DBFS上,直接用Python内置的文件操作读取更稳妥,还能避免Spark API带来的换行问题:

# 替换原来的filedata和part相关代码
with open("/dbfs/<path>/df.csv", "rb") as f:
    part = MIMEApplication(f.read(), Name="df.csv")
part['Content-Disposition'] = 'attachment; filename="%s"' % 'df.csv'

额外优化小技巧

如果你不需要把CSV先存到DBFS,其实可以直接把Pandas DataFrame转成CSV字符串,跳过写入文件的步骤,效率更高:

# 直接生成CSV内容,不用写文件
csv_content = df.toPandas().to_csv(index=False, encoding='utf-8')
part = MIMEApplication(csv_content.encode('utf-8'), Name="df.csv")

(加个index=False还能避免把DataFrame的索引列写入CSV,省得出现多余的无用列)

内容的提问来源于stack exchange,提问作者Ashley O

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:02:35