我试图从具有一些类似于 jinaj2 模板语法的表达式的 yaml 文件中解析数据,目标是删除或添加一些项目到文件中。
添加代码列表.yaml
AddCodesList:
body:
list:
{% for elt in customer %}
- code: {{ elt.code }}
name: {{ elt.name }}
country: {{ elt.country }}
{% endfor %}
result:
json:
responseCode: {{ responseCode }}
responseMsg: {{ responseMsg }}
responseData: {{ responseData }}
Run Code Online (Sandbox Code Playgroud)
解析文件
import ruamel.yaml
from ruamel.yaml.util import load_yaml_guess_indent
data,indent,block_seq_indent=load_yaml_guess_indent(open('AddCodesList.yaml'), preserve_quotes=True)
#delete item
del data['body']['list']['code']
#add new item
data['parameters'].insert(2, 'ssl_password','xxxxxx')#create new file
ruamel.yaml.round_trip_dump(data, open('missingCode.yaml', 'w'), explicit_start=True)
Run Code Online (Sandbox Code Playgroud)
执行 parseFile.py 脚本时出现以下错误:
Traceback (most recent call last):
File "d:/workspace/TEST/manageItem.py", line 4, in <module>
data, indent, block_seq_indent = load_yaml_guess_indent(open('AddCodesList.
...
if self.check_token(ValueToken):
File "C:\Python34\lib\site-packages\ruamel\yaml\scanner.py", line 1534, in ch
self.fetch_more_tokens()
File "C:\Python34\lib\site-packages\ruamel\yaml\scanner.py", line 269, in fet
% utf8(ch), self.get_mark())
ruamel.yaml.scanner.ScannerError: while scanning for the next token
found character '%' that cannot start any token
in "<unicode string>", line 4, column 6:
{% for elt in customer %}
^ (line: 4)
Run Code Online (Sandbox Code Playgroud)
在 YAML 中,'{' 开始一个流样式映射,所以 (% ) 将成为该映射的第一个键的开始,并且该字符不允许作为第一个字符。
通常你会先处理文件的模板,然后应用 YAML。您无法轻松逆转该过程,因为 list 的值必须是有效的 YAML 构造。
使其可解析的解决方案之一是将值更改为list有效的 YAML,例如:
list:
- {% for elt in customer %}
- code: {{ elt.code }}
name: {{ elt.name }}
country: {{ elt.country }}
- {% endfor %}
Run Code Online (Sandbox Code Playgroud)
或者:
list: |
{% for elt in customer %}
- code: {{ elt.code }}
name: {{ elt.name }}
country: {{ elt.country }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
这将不再使它成为可模板化的 bij jinja2。
您可以更改 jinja2 中的启动顺序{%,但这对您没有帮助(即您仍然无法获得有效的 YAML)。我目前看到的唯一真正的解决方案是完全删除 jinja2 并for使用一些类似于 Python 中的对象的列表(在访问时扩展)来实现循环。
如果允许在应用jinja2之前始终进行预处理,则可以将文件更改为:
AddCodesList:
body:
list:
# {% for elt in customer %}
- code: '{{ elt.code }}'
name: '{{ elt.name }}'
country: '{{ elt.country }}'
# {% endfor %}
Run Code Online (Sandbox Code Playgroud)
因为这将加载,但您可能需要改变# b{,只是{运行你的模板引擎之前。
引号与单引号之间只有单引号有特殊含义。使用双引号,您会更频繁地得到预处理器插入的内容,从而使 YAML 不正确(例如 DOS/Windows 风格的完整文件路径:'C:\yaml\abc.yaml'正确,但"c:\yaml\abc.yaml"会在 YAML 解析过程中出现错误。
该问题通过以下结构解决:
AddCodesList:
body:
list:
# {% for elt in customer %}
- code: "{{ elt.code }}"
name: "{{ elt.name }}"
country: "{{ elt.country }}"
# {% endfor %}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12374 次 |
| 最近记录: |