【问题标题】:How to parse and append to flexget yaml config file?如何解析并附加到 flexget yaml 配置文件?
【发布时间】:2014-05-23 04:51:20
【问题描述】:

我正在尝试从 flexget 配置文件中解析和添加/删除节目。

我最终计划在节目名称旁边创建一个带有复选框并添加/删除它们的小网页,但首先我需要在我拥有此代码的那一刻完成 yaml 解析:

#!/usr/bin/env python
import yaml
with open("shows.yml") as f:
        doc = yaml.safe_load(f)

shows = doc['series']['shows']
sets = doc['series']['settings']
shows.append('new show')
# this makes the list a little neater while printed to the file
showsa = []
for a in test:
  showsa.append(a)

testa = {'series': { 'shows': showsa, 'settings': sets }}

with open("showsnew.yml", 'w') as g:
        g.write( yaml.dump(testa, default_flow_style=False) )

这会打开旧配置,在列表中添加一个新节目,然后将其打印到文件中,除了输出的配置有点混乱之外,它几乎是完美的:

**What I should get is:**                    **But instead I get:**
shows:                                         shows:
  settings:                                      settings:
    shows:                                         shows:
      setting1: value                                setting1: value
      setting2:                                      setting2:
        - value                                      - value
        - value                                      - value
  shows:                                         shows:
    - show1                                      - show1
    - show2                                      - show2
    - new show                                   - new show

虽然差别不大(只是“-”后面两个空格的行),但我认为它最终可能会在稍后阶段弄乱配置。

我知道手动添加和删除节目很简单,但是当我使用数据库来获取其他节目信息时,能够编写脚本将节目添加到 flexget 和数据库以及其他一些任务会很方便。

有谁知道我做错了什么小事?或者这就是 python 中 pyYaml 的工作方式?

目前我正在考虑对文件进行解析并在以“-”符号开头的每一行添加 2 个空格的可能性。或者在开始时以正确的间距将每个节目逐行写入文件(或之前的字符串)中。

但我认为一定有更好的方法。

【问题讨论】:

    标签: python linux configuration yaml


    【解决方案1】:

    我现在偶然发现了同样的问题。
    我想出了这个:

    def writeYaml(data, filename):
    
      sections = data.keys()
      dump = yaml.dump(data, default_flow_style=False)
    
      # set 2 indent spaces in every line
      out = dump.replace('\n', '\n  ')
      # re-set indentation for sections only
      for i in sections:
          out = out.replace('\n  %s' % i, '\n%s' % i)
    
      with open(filename, 'w') as yaml_file:
          yaml_file.write(out)
    

    【讨论】:

      【解决方案2】:

      我继续并实现了一个简单的函数来解析给出的文件,以便在受影响的行中添加额外的 2 个空格,因为它需要不到一秒的时间完成并且不明显。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2020-06-05
        • 2017-11-17
        • 2018-07-16
        相关资源
        最近更新 更多