如何将Pandas DataFrame以.feather格式写入GCS?
问题原因
- pandas的
to_csv()方法无参调用时默认返回CSV格式字符串,可直接传入GCS SDK的upload_from_string方法完成上传,因此你之前的CSV上传逻辑可以正常运行。 to_feather()的接口设计与to_csv()不同:它没有无参返回内容的逻辑,必须传入fname参数指定写入目标(本地路径或类文件对象),直接无参调用就会触发必填参数报错。另外feather属于二进制存储格式,你代码中使用的text/featherMIME类型不符合规范,应该使用二进制类型application/octet-stream。
推荐解决方案
方案1:内存缓冲区中转(无需生成本地文件,适合绝大多数场景)
使用Python内置的io.BytesIO作为内存类文件对象承载feather内容,直接上传即可:
import io # 将Feather格式数据写入内存缓冲区 buffer = io.BytesIO() dataframe.reset_index().to_feather(buffer) # 重置缓冲区指针到起始位置,避免上传内容为空 buffer.seek(0) # 上传到GCS存储桶 blob = bucket.blob(path) blob.upload_from_file(buffer, content_type='application/octet-stream')
方案2:本地临时文件中转(适合超大数据量、内存不足场景)
如果DataFrame体积过大无法在内存中缓存,可以先写入本地临时文件,上传完成后删除临时文件即可:
import tempfile import os # 创建临时文件写入Feather数据 with tempfile.NamedTemporaryFile(suffix='.feather', delete=False) as tmp_file: tmp_path = tmp_file.name dataframe.reset_index().to_feather(tmp_path) # 上传临时文件到GCS blob = bucket.blob(path) blob.upload_from_filename(tmp_path, content_type='application/octet-stream') # 上传完成后删除本地临时文件 os.unlink(tmp_path)
内容的提问来源于stack exchange,提问作者Kyo
相关产品推荐
相关产品推荐

