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

将Parquet文件编码为io.Bytes并上传至MinIO时遇AttributeError问题求助

解决Parquet文件转换为Bytes格式并上传MinIO的问题

你遇到的AttributeError: 'DataFrame' object has no attribute 'encode'错误原因很清晰:pd.read_parquet()返回的是DataFrame对象,而DataFrame并没有encode方法——这个方法是字符串类型的专属方法,只适用于你之前处理的CSV、JSON、TXT这类文本格式文件。

Parquet是二进制列式存储格式,不能用处理文本的思路来转换字节流,下面给你两种高效的解决方案:


方案一:直接在内存生成Parquet字节流(推荐,避免本地文件IO)

你不需要先把DataFrame保存到本地Parquet文件再读取,直接用pandas的to_parquet方法写入BytesIO缓冲区,就能直接得到可用于MinIO上传的字节流:

import pandas as pd
import io
import MinioConn

filename = 'myfile.parquet'
# 构造示例DataFrame
df = pd.DataFrame(data=[['tom', 10], ['nick', 15], ['juli', 14]], columns=['Name', 'Age'])

# 将DataFrame直接写入BytesIO,生成Parquet格式字节流
buffer = io.BytesIO()
df.to_parquet(buffer)
# 关键:重置缓冲区指针到开头,否则MinIO读取时会从末尾开始,获取不到内容
buffer.seek(0)

# 连接MinIO并上传
bucket = 'synthetic-data-gen'
client = MinioConn.MinioConn().client()
client.put_object(
    bucket,
    f'foo/bar/{filename}',
    data=buffer,
    length=buffer.getbuffer().nbytes,  # 获取缓冲区的字节大小
    content_type='application/parquet'  # Parquet的标准MIME类型
)

方案二:读取本地已存在的Parquet文件

如果你确实需要从本地Parquet文件读取内容上传,直接以二进制模式读取文件内容即可,不需要通过pandas读取为DataFrame:

import io
import MinioConn

filename = 'myfile.parquet'
bucket = 'synthetic-data-gen'

# 以二进制模式读取本地Parquet文件
with open(filename, 'rb') as parquet_file:
    parquet_bytes = parquet_file.read()

# 转为BytesIO缓冲区
buffer = io.BytesIO(parquet_bytes)

# 上传到MinIO
client = MinioConn.MinioConn().client()
client.put_object(
    bucket,
    f'foo/bar/{filename}',
    data=buffer,
    length=len(parquet_bytes),
    content_type='application/parquet'
)

关键注意事项:

  • Parquet是二进制格式,不需要转成字符串再encode,直接处理原始字节流即可;
  • 使用BytesIO时,写入数据后必须调用seek(0)重置指针,否则MinIO会读取空内容;
  • 明确指定content_type='application/parquet',比动态拆分文件名更可靠规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:48:11