user2050283绝对是对的,它是yaml,这使得解析变得容易。主要是出于教育原因,我试着自己去分析。期待一些反馈。在

就像你的数据的层次结构。因此,让我们用Python定义一个树,尽可能简单(reference):from collections import defaultdict

def tree(): return defaultdict(tree)

接下来,让我们在一个解析函数中使用这个树。它遍历行,查看缩进,记录当前路径(也称为breadcrumbs),并尝试将一行拆分为键和值(如果存在),并填充我们的树。在适当的情况下,我提取逻辑块作为单独的函数,如下所示。如果一个缩进与之前的任何缩进都不匹配,它就会抛出一个错误——基本上就像Python对其源代码所做的那样。在

^{pr2}$

我创建的helper函数是:set_leaf_value_from_path获取树、路径(键列表)和值。它使用递归下降到树中,并设置路径定义的叶的值。在

读取“键”和“值”:首先将行拆分为“键”和“值”:

是否有效行:用于检查行是否为空或以数字符号开头

这是完整的脚本from collections import defaultdict

def tree(): return defaultdict(tree)

def dicts(t):

if isinstance(t, dict):

return {k: dicts(t[k]) for k in t}

else:

return t

def load_data(f):

doc = tree()

previous_indents = [""]

path = [""]

for line in map(lambda x: x.rstrip("\n"),

filter( is_valid_line, f)

):

line_wo_indent = line.lstrip(" ")

indent = line[:(len(line) - len(line_wo_indent))]

k, v = read_key_and_value(line_wo_indent)

if len(indent) > len(previous_indents[-1]):

previous_indents.append(indent)

path.append(k)

elif len(indent) == len(previous_indents[-1]):

path[-1] = k

else: # indent is shorter

try:

while previous_indents[-1] != indent:

previous_indents.pop()

path.pop()

except IndexError:

raise IndentationError("Indent doesn't match any previous indent.")

path[-1] = k

if v is not None:

set_leaf_value_from_path(doc, path, v)

return doc

def set_leaf_value_from_path(tree_, path, value):

if len(path)==1:

tree_[path[0]] = value

else:

set_leaf_value_from_path(tree_[path[0]], path[1:], value)

def read_key_and_value(line):

pos_of_first_column = line.index(":")

k = line[:pos_of_first_column].strip()

v = line[pos_of_first_column+1:].strip()

return k, v if len(v) > 0 else None

def is_valid_line(line):

if line.strip() == "":

return False

if line.lstrip().startswith("#"):

return False

return True

if __name__ == "__main__":

import cStringIO

document_str = """

statistics:

time-started: Tue Feb 5 15:33:35 2013

time-sampled: Thu Feb 7 12:25:39 2013

statistic:

active: 0

interactive: 0

count: 1

up:

packets: 2

bytes: 2

down:

packets: 3

bytes: 3

"""

f = cStringIO.StringIO(document_str)

doc = load_data(f)

from pprint import pprint

pprint(dicts(doc))

已知限制:仅支持标量作为值

仅字符串标量作为值

不支持多行标量

注释并不像定义中那样实现,即它们不能从一行中的任何地方开始;只有以数字符号开头的行才被视为注释

这些只是已知的限制。我肯定YAML的其他部分也不受支持。但这对你的数据来说已经足够了。在

python中字符串转xml对象_将文本字符串转换为XML相关推荐

  1. python中可迭代对象_什么是python中的可迭代对象(iterable object)?

    我们经常在打印报错信息中和英文的文档中看到iter这个词根,可以组合成iterable/iterate等派生词.这个iter可以翻译成"迭代",这样iterable object的 ...

  2. python中常用的序列化模块_使用pickle模块对python对象进行序列化

    pickle模块是Python自带的一个标准模块,专用于Python各种对象的序列化和反序列化,可用于Python内置的各种数据对象(Python中一切都是对象),也可用于程序员自定义的类和对象. p ...

  3. java如果把字符串转成对象_为什么Java中的字符串对象是不可变的,有什么好处?...

    专注于Java领域优质技术号,欢迎关注 原创: 阿杜的世界 阅读本文大概需要 4分钟. 所谓不可变对象,是指一个对象在创建后,它的内部状态不会被改变的对象.这意味着当我们将一个不可变对象的引用赋值给某 ...

  4. Python 中的可执行对象 eval,exec 和 compile与其在深度学习训练中的应用实例

    Python 中的可执行对象 eval,exec 和 compile 与其在深度学习训练中的应用实例 eval 计算指定表达式的值.也就是说它要执行的python代码只能是单个表达式(注意eval不支 ...

  5. SICP2——Python中使用函数构建对象

    一.使用对象构建抽象 1.1 数据抽象 现在到了数学抽象中最关键的一步:让我们忘记这些符号所表示对象.-根本不必考虑它们到底代表着什么东西. 上一篇文章主要强调的是对数据的操作以及这些操作之间的组合与 ...

  6. python中的不可变对象_python中的可变与不可变对象

    什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址. ...

  7. python中五种下划线 _

    python中五种下划线 "_" 单前导下划线:_var 单末尾下划线:var_ 双前导下划线:__var 双前导和末尾下划线:var 单下划线:_ 在文章结尾处,你可以找到一个简 ...

  8. python中requests库的用途-python中requests库session对象的妙用详解

    在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 妙用1 requests库的session对象能够帮我们跨请求保持某些参数,也 ...

  9. Python中 redis StrictRedis对象操作string类型

    Python中 redis StrictRedis对象操作string类型 准备 在桌面上创建redis目录 使用pycharm打开 redis目录 创建redis_string.py文件 from ...

最新文章

  1. 实战 Docker+Kubernetes 微服务容器化(二)-微服务带来的问题及解决方案分析
  2. shell高级(一)
  3. select返回记录的顺序
  4. Hadoop历代版本及其特点
  5. 《黑客攻防技术宝典Web实战篇@第2版》读书笔记1:了解Web应用程序
  6. django--通过model拿到字段对象
  7. TitleWindow的CloseButtionSkin问题
  8. 将 php 转换/编译为 EXE
  9. Javascript:面向对象举例——矩形类及其实例化
  10. java基本操作-2
  11. excel取消密码_【Excel神技能】如何锁定Excel表中的公式,防止被修改?
  12. 虚拟机SSH免密登录配置
  13. 计算机大作业的范本,计算机应用基础大作业.doc
  14. 查看计算机真实用户名(username)
  15. Unity 计算模型的中心点的方法
  16. 怎样给WordPress友情链接添加nofollow
  17. 51单片机用1602液晶屏实现可调时钟
  18. 根据电压判断NPN和PNP管型
  19. 极端类别不平衡数据下的分类问题研究综述,终于有人讲全了!
  20. 第九十一章 SQL函数 LOWER

热门文章

  1. 负数转无符号运算 (-1对256取模)
  2. Win 7系统优化小工具 (批处理)
  3. 基于matlab的复杂背景下不规则目标边缘提取算法的仿真
  4. (全栈旅行足迹地图打卡网站 0-1)-项目旅行足迹布局-04(WebGIS Vue-js-go-mysql)
  5. 【049】国家图书馆-国图海量书籍在线搜索,部分可阅读
  6. AP微积分考试备考重点
  7. 金蝶eas怎么引出凭证_金蝶EAS系统标准凭证导入需要什么数字格式
  8. 手把手带你清理电脑版微信冗余资源
  9. pdf怎么在线阅读?一键查阅并不难
  10. 10 个优秀的占位图片生成服务