【问题标题】:Convert text file to yaml in python在python中将文本文件转换为yaml
【发布时间】:2020-11-14 06:16:31
【问题描述】:

我有一个格式如下的文本文件:

{'Server Type: ABCDDEER' :['name: abcd01t' ,'IP: 127.12.32.52', 'tags: ALL, APP,EER, REER1']},
{'Server Type: ABCDDEER' :['name: abcd02t' ,'IP: 127.12.32.53', 'tags: ALL, APP,EER, REER2']},
{'Server Type: ABCDDEER' :['name: abcd03t' ,'IP: 127.12.32.54', 'tags: ALL, APP,EER, REER1']},
{'Server Type: ABCDDEER' :['name: abcd04t' ,'IP: 127.12.32.55', 'tags: ALL, APP,EER, REER2']},
{'Server Type: ABCDDPP' :['name: abcd1t' ,'IP: 127.12.32.36', 'tags: ALL, APP,PP,  PP1']},
{'Server Type: ABCDDPP' :['name: abcd2t' ,'IP: 127.12.32.37', 'tags: ALL, APP,PP,  PP2']},
{'Server Type: ABCDDPP' :['name: abcd3t' ,'IP: 127.12.32.38', 'tags: ALL, APP,PP,  PP1']},
{'Server Type: ABCDDPP' :['name: abcd4t' ,'IP: 127.12.32.39', 'tags: ALL, APP,PP,  PP2']},
{'Server Type: ABCDDPP' :['name: abcd5t' ,'IP: 127.12.32.47', 'tags: ALL, APP,PP,  PP1']},
{'Server Type: ABCDDPP' :['name: abcd6t' ,'IP: 127.12.32.41', 'tags: ALL, APP,PP,  PP2']},
{'Server Type: ABCDDPP' :['name: abcd7t' ,'IP: 127.12.32.42', 'tags: ALL, APP,PP,  PP1']},
{'Server Type: ABCDDPP' :['name: abcd8t' ,'IP: 127.12.32.48', 'tags: ALL, APP,PP,  PP2']},
{'Server Type: ABCDDPP' :['name: abcd9t' ,'IP: 127.12.32.44', 'tags: ALL, APP,PP,  PP1']},
{'Server Type: ABCDDPP' :['name: abcd0t' ,'IP: 127.12.32.49', 'tags: ALL, APP,PP,  PP2']}

有什么方法可以直接转成yaml,这样就可以是下面的格式了:


"Server Type: ABCDDEER"
: 
  - "name: abcd01t"
  - "IP: 127.12.32.52"
  - "tags: ALL, APP,EER, REER1"

  - "name: abcd02t"
  - "IP: 127.12.32.53"
  - "tags: ALL, APP,EER, REER2"

  - "name: abcd03t"
  - "IP: 127.12.32.54"
  - "tags: ALL, APP,EER, REER2"

"Server Type: ABCDDPP"
: 
  - "name: abcd1t"
  - "IP: 127.12.32.36"
  - "tags: ALL, APP,PP,  PP1"

因此 serverTyoe 是标头,并且具有相同 serverType 的任何内容都包含在其中。

任何帮助将不胜感激。非常感谢!

【问题讨论】:

  • 以下格式不是有效的 YAML;除非您使用 ? 显式标记键,否则冒号必须与键位于同一行。即使这样,PyYAML 也不允许您在块序列中插入空行。您需要手动格式化。

标签: python python-2.7 yaml pyyaml


【解决方案1】:

使用yaml 模块。

例如:

import ast
import yaml

result = {}
with open("data.txt") as infile:
    for line in infile:
        d = ast.literal_eval(line.strip().rstrip(","))
        for k, v in d.items():
            result.setdefault(k, []).extend(v)     #groupby header

with open("outfile.yaml", 'w') as yfile:
    yaml.dump(result, yfile)

【讨论】:

  • 谢谢拉克什!感谢您的快速帮助!
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2018-11-23
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
相关资源
最近更新 更多