将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
相关产品推荐
相关产品推荐

