杰瑞科技汇

Python parseFrom如何正确解析数据?

Python 标准库中没有名为 parseFrom 的函数或方法,这个术语通常出现在其他语言的上下文中,或者是在 Python 中使用了特定的第三方库。

Python parseFrom如何正确解析数据?-图1
(图片来源网络,侵删)

parseFrom 这个名字通常暗示着一种特定的解析模式:

  • Parse: 解析,指将结构化的数据(如字符串、字节流)转换成 Python 的原生数据类型(如字典、列表、对象)。
  • From: 来自,指明了数据的来源。

parseFrom 的含义可以理解为 “从某个来源(如字节串、文件流)解析并反序列化成目标对象”

下面,我将根据最常见的场景,为你详细解释在 Python 中如何实现这种功能。


解析 Protocol Buffers (protobuf) - 最常见的 parseFrom

在 Java 或其他语言中,Protocol Buffers (protobuf) 生成的代码里,经常会有一个类似 parseFrom(byte[] data) 的静态方法,用于从一个字节数组反序列化一个消息对象。

Python parseFrom如何正确解析数据?-图2
(图片来源网络,侵删)

在 Python 中,protobuf 的实现方式略有不同,但功能是等价的,Python 的 protobuf 库使用 ParseFromString() 方法。

安装 protobuf 库

如果你还没有安装,请先安装:

pip install protobuf

定义 .proto 文件并生成 Python 代码

假设你有一个 person.proto 文件:

// person.proto
syntax = "proto3";
message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

使用 protobuf 编译器 (protoc) 生成 Python 代码:

Python parseFrom如何正确解析数据?-图3
(图片来源网络,侵删)
# 确保已安装 protoc
# 在项目根目录下运行
protoc --python_out=. person.proto

这会生成一个 person_pb2.py 文件。

使用 ParseFromString() 实现 parseFrom 的功能

ParseFromString() 是 protobuf 消息对象的一个实例方法,它的作用和你理解的 parseFrom 完全一样:从一个字节串解析并填充当前这个消息对象

import person_pb2
# 1. 创建一个空的 Person 消息对象
person = person_pb2.Person()
# 2. 准备一个序列化后的字节串 (这通常是从网络或文件中读取的)
#    这里我们手动创建一个用于演示
serialized_data = b'\n\x05Alice\x10\x01\x12\x0cuser@example.com'
# 3. 调用 ParseFromString() 进行解析
#    这会将字节串中的数据填充到 `person` 对象中
person.ParseFromString(serialized_data)
# 4. 现在可以像普通 Python 对象一样访问数据
print(f"Name: {person.name}")
print(f"ID: {person.id}")
print(f"Email: {person.email}")
# 输出:
# Name: Alice
# ID: 1
# Email: user@example.com

关键区别:

  • Java/C++: Person person = Person.parseFrom(data); (静态方法,直接返回新对象)
  • Python: person.ParseFromString(data); (实例方法,修改现有对象)

在 Python 中,你通常会先创建一个空对象,然后用 ParseFromString 去填充它,这达到了和 parseFrom 同样的效果。


解析 JSON 数据

JSON 是另一种非常通用的数据交换格式,虽然它的解析函数通常不叫 parseFrom,但其核心思想是相同的。

Python 标准库 json 提供了 loads() (load string) 和 load() (from file-like object) 方法。

从字符串解析 (json.loads())

这相当于从“字符串”来源解析。

import json
# 1. 准备一个 JSON 格式的字符串
json_string = '{"name": "Bob", "age": 30, "isStudent": false}'
# 2. 使用 json.loads() 解析成 Python 字典
data_dict = json.loads(json_string)
# 3. 访问解析后的数据
print(f"Name: {data_dict['name']}")
print(f"Age: {data_dict['age']}")
print(f"Is Student: {data_dict['isStudent']}")
# 输出:
# Name: Bob
# Age: 30
# Is Student: False

从文件解析 (json.load())

这相当于从“文件”来源解析。

假设你有一个文件 data.json 内容如下:

{
  "city": "New York",
  "population": 8400000
}

Python 代码可以这样写:

import json
# 1. 打开文件
with open('data.json', 'r') as f:
    # 2. 使用 json.load() 直接从文件对象解析
    data = json.load(f)
# 3. 访问数据
print(f"City: {data['city']}")
print(f"Population: {data['population']}")
# 输出:
# City: New York
# Population: 8400000

解析 XML 数据

Python 标准库 xml.etree.ElementTree 也可以用来解析 XML。

从字符串解析

import xml.etree.ElementTree as ET
xml_string = '<root><child1>Value1</child1><child2>Value2</child2></root>'
# 从字符串解析
root = ET.fromstring(xml_string)
# 访问数据
print(f"Child1 text: {root.find('child1').text}")
print(f"Child2 text: {root.find('child2').text}")
# 输出:
# Child1 text: Value1
# Child2 text: Value2

从文件解析

假设有一个文件 data.xml:

<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

Python 代码:

import xml.etree.ElementTree as ET
# 从文件解析
tree = ET.parse('data.xml')
root = tree.getroot()
# 访问数据
to = root.find('to').text
body = root.find('body').text
print(f"To: {to}")
print(f"Body: {body}")
# 输出:
# To: Tove
# Body: Don't forget me this weekend!

解析 CSV 数据

Python 标准库 csv 用于处理 CSV 文件。

从文件解析

import csv
# 假设有一个文件 users.csv
# name,age,city
# Alice,30,New York
# Bob,25,Los Angeles
with open('users.csv', 'r') as file:
    # csv.reader 会返回一个迭代器,每次返回一行数据(列表形式)
    csv_reader = csv.reader(file)
    # 读取表头
    header = next(csv_reader)
    print(f"Header: {header}")
    # 读取数据行
    for row in csv_reader:
        print(f"Name: {row[0]}, Age: {row[1]}, City: {row[2]}")
# 输出:
# Header: ['name', 'age', 'city']
# Name: Alice, Age: 30, City: New York
# Name: Bob, Age: 25, City: Los Angeles
数据格式 Python 库 从字符串解析 从文件/字节流解析 核心思想(对应 parseFrom
Protocol Buffers protobuf obj.ParseFromString(bytes) obj.ParseFromFileDescriptor(fd) 从字节串反序列化填充对象
JSON json json.loads(str) json.load(file_obj) 从字符串或文件反序列化成字典/列表
XML xml.etree.ElementTree ET.fromstring(str) ET.parse(file_path) 从字符串或文件解析成元素树
CSV csv (通常不直接从字符串) csv.reader(file_obj) 从文件读取行数据

当你看到 parseFrom 这个词时,不要直接在 Python 中寻找它,你应该思考:

  1. 数据是什么格式的? (是 protobuf 字节串?是 JSON?还是 XML?)
  2. 数据来源是什么? (是内存中的字符串/字节?还是磁盘上的文件?)

然后根据上表的对应关系,选择 Python 中正确的库和方法来完成“从某个来源解析数据”的任务,对于最常见的 protobuf 场景,ParseFromString() 就是你需要的 parseFrom 的 Python 实现。

分享:
扫描分享到社交APP
上一篇
下一篇