如何将pandas DataFrame导出为内存PNG字节流 无需本地保存直传S3
实现方案
不需要生成本地临时文件,直接通过内存字节流完成全流程即可,注意两个容易踩的坑:
dataframe_image的export方法原生支持传入可写入的类文件对象作为输出目标,并非只能传本地磁盘路径- boto3的
upload_file方法仅支持读取本地磁盘文件,上传内存中的二进制流需要改用upload_fileobj方法
完整实现代码如下:
import io import boto3 import dataframe_image as dfi # 初始化S3会话 session = boto3.Session( aws_access_key_id='<key>', aws_secret_access_key='<secret>', ) s3 = session.resource('s3') # 初始化内存字节缓冲区 img_buffer = io.BytesIO() # 直接将DataFrame渲染后的PNG内容写入内存缓冲区 dfi.export(final, img_buffer) # 将缓冲区读取指针重置到起始位置,否则上传时会读到空内容 img_buffer.seek(0) # 直接从内存上传文件到S3 s3.meta.client.upload_fileobj( img_buffer, 'pdpublickbucket', 'df_custom.png' ) img_buffer.close()
常见失败原因:之前尝试临时文件/内存方案失败基本都是两个问题:一是错用
upload_file接口传非路径参数,二是写入完成后没有重置流指针,导致上传的文件大小为0。该方案导出的图片内容和本地保存的完全一致,不会有画质或内容偏差。
内容的提问来源于stack exchange,提问作者Dmitriy_kzn
相关产品推荐
相关产品推荐

