python - 在 Python 中解析自定义文本文件
问题描述
我有一个要解析的文本,这是文本的简洁形式。
apple {
type=fruit
varieties {
color=red
origin=usa
}
}
输出应如下所示
apple.type=fruit
apple.varieties.color=red
apple.varieties.origin=usa
到目前为止,我想出的唯一方法是 python 中的一种广度优先方法。但我不知道如何让所有的孩子都进去。
progInput = """apple {
type=fruit
varieties {
color=red
origin=usa
}
}
"""
progInputSplitToLines = progInput.split('\n')
childrenList = []
root = ""
def hasChildren():
if "{" in progInputSplitToLines[0]:
global root
root = progInputSplitToLines[0].split(" ")[0]
for e in progInputSplitToLines[1:]:
if "=" in e:
childrenList.append({e.split("=")[0].replace(" ", ""),e.split("=")[1].replace(" ", "")})
hasChildren()
PS:我查看了 Python 中的树结构并遇到了 anytree(https://anytree.readthedocs.io/en/latest/),你认为这对我的情况有帮助吗?
你能帮帮我吗?我不太擅长解析文本。提前感谢一堆。:)
解决方案
由于您的文件是 HOCON 格式,您可以尝试使用pyhocon
HOCON 解析器模块来解决您的问题。
安装:运行pip install pyhocon
,或下载 github 存储库并使用python setup.py install
.
基本用法:
from pyhocon import ConfigFactory
conf = ConfigFactory.parse_file('text.conf')
print(conf)
这给出了以下嵌套结构:
ConfigTree([('apple', ConfigTree([('type', 'fruit'), ('varieties', ConfigTree([('color', 'red'), ('origin', 'usa')]))]))])
ConfigTree
只是一个,如源代码collections.OrderedDict()
中所见。
更新:
要获得所需的输出,您可以创建自己的递归函数来收集所有路径:
from pyhocon import ConfigFactory
from pyhocon.config_tree import ConfigTree
def config_paths(config):
for k, v in config.items():
if isinstance(v, ConfigTree):
for k1, v1 in config_paths(v):
yield (k,) + k1, v1
else:
yield (k,), v
config = ConfigFactory.parse_file('text.conf')
for k, v in config_paths(config):
print('%s=%s' % ('.'.join(k), v))
哪些输出:
apple.type=fruit
apple.varieties.color=red
apple.varieties.origin=usa
推荐阅读
- javascript - JavaScript,无法读取未定义的属性,但已定义
- tsql - 如何将 %20 替换为特定列中的空格?
- python - 为另一列中的每个唯一值创建一个具有唯一值的列
- ruby-on-rails - 当服务器返回 503 时,为什么 Net::HTTP 返回 500?
- sql - 用于插入数据的 Sql 查询
- javascript - 有条件地减少 JavaScript 对象数组
- ios - 如何在组合中对具有不同失败类型的两个发布者进行平面映射
- ios - 如何为使用 Mac Catalyst 移植到 Mac 的 iPad 应用程序设置“帮助”菜单选项?
- google-apps-script - 如何在 Google Apps 脚本中检查一个日期是否晚于另一个日期
- html - HTML Grid 系统 - 移动视图中的 div 顺序