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

如何用Python从CSV生成Protobuf(proto)文件?

解决方案:CSV/Parquet转Protobuf(PyCharm环境)

1. 定义Protobuf结构文件

先创建对应CSV结构的.proto文件,比如命名为person.proto:

syntax = "proto3";

// 单条人员数据结构
message Person {
  string surname = 1;  // 对应CSV的Surname列
  string name = 2;     // 对应CSV的Name列
}

// 用于存储多条数据的容器(如果需要批量处理)
message PersonList {
  repeated Person people = 1;
}

2. 编译.proto文件生成Python代码

  1. 在PyCharm终端安装Python的Protobuf依赖:
    pip install protobuf
    
  2. 安装Protobuf编译器protoc:
    • 从Protobuf官方仓库下载对应系统的编译器,解压后将protoc可执行文件路径添加到系统环境变量,或者直接在PyCharm终端指定路径调用。
  3. 编译.proto文件:
    protoc --python_out=. person.proto
    
    执行后会生成person_pb2.py文件,这是后续Python代码要导入的Protobuf操作模块。

3. 读取Parquet/CSV并转换为Protobuf格式

以读取Parquet文件为例,先安装依赖:

pip install pandas pyarrow

然后编写转换代码:

import pandas as pd
import person_pb2

# 读取Parquet文件
df = pd.read_parquet("your_data.parquet")

# 初始化批量数据容器
person_list = person_pb2.PersonList()

# 遍历数据生成Protobuf对象
for _, row in df.iterrows():
    # 处理空值避免序列化失败
    person = person_list.people.add()
    person.surname = row["Surname"] if pd.notna(row["Surname"]) else ""
    person.name = row["Name"] if pd.notna(row["Name"]) else ""

# 序列化并保存为Protobuf二进制文件
with open("people_data.pb", "wb") as f:
    f.write(person_list.SerializeToString())

# 验证转换结果
with open("people_data.pb", "rb") as f:
    loaded_data = person_pb2.PersonList()
    loaded_data.ParseFromString(f.read())

for p in loaded_data.people:
    print(f"Surname: {p.surname}, Name: {p.name}")

如果是直接读取CSV,把pd.read_parquet替换为pd.read_csv("your_data.csv")即可。

常见问题排查

  • 编译报错:检查protoc是否正确安装并添加到环境变量,或者在命令中直接指定protoc的绝对路径。
  • 字段匹配失败:确保.proto文件的字段名与CSV/Parquet的列名完全一致(注意大小写)。
  • 序列化失败:检查数据中是否有None或非字符串类型值,提前做空值处理或类型转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:45:45