作者:waxw | 来源:互联网 | 2023-09-08 19:30
我正在尝试从官方的Google字体存储库中解析一个MetaDATA.pb文件,该文件可在以下位置找到:https://github.com/google/fonts(Roboto字体的示例MetaDATA.pb文件:https://github.com/google/fonts/blob/master/apache/roboto/METADATA.pb)>
要解析原始buf文件,需要正确的格式。可以在此处下载为“ public_fonts.proto”:https://github.com/googlefonts/gftools/blob/master/Lib/gftools/fonts_public.proto
我用它通过以下命令生成了一个名为“ fonts_public_pb2.py”的Python代码文件:
protoc -I=. --python_out=. fonts_public.proto
这是我的代码,该代码导入此生成的文件,读取MetaDATA.pb文件的内容(不管是哪个文件,它们都遵循相同的结构),然后尝试解析原始Buf字符串。 / p>
#! /usr/bin/env python
import fonts_public_pb2
protobuf_file_path = 'MetaDATA.pb'
protobuf_file = open(protobuf_file_path,'rb')
protobuf = protobuf_file.read()
font_family = fonts_public_pb2.FamilyProto()
font_family.ParseFromString(protobuf)
只有几行,没有什么太复杂的,但是输出始终是相同的:
Traceback (most recent call last):
File "parse.py",line 22,in
font_family.ParseFromString(protobuf)
google.protobuf.message.DecodeError: Error parsing message
我通常不使用Python编写代码,所以这里的问题很可能是我自己,但是尝试了一些不同的事情后,我不知道该怎么做了
- 使用了gftools存储库中已生成的“ fonts_public_pb2.py”文件:https://github.com/googlefonts/gftools/blob/master/Lib/gftools/fonts_public_pb2.py-我从“ public_fonts.proto”文件生成的输出与此文件几乎相同,我检查了Meld。错误仍然相同
- 将.proto文件中的所有“必需”字段设置为“可选”,再次生成“ fonts_public_pb2.py”文件-相同错误
- 尝试过Python 2和3-相同的错误
那些METADATA.pb文件不是二进制protobuf文件,它们使用text format。
import fonts_public_pb2
from google.protobuf import text_format
protobuf_file_path = 'METADATA.pb'
protobuf_file = open(protobuf_file_path,'r')
protobuf = protobuf_file.read()
font_family = fonts_public_pb2.FamilyProto()
text_format.Merge(protobuf,font_family)
print(font_family)