簡體   English   中英

為什么不能解析我的簡單YAML文件而不產生錯誤“此處不允許映射值”?

[英]Why can I not parse my simple YAML file without yielding the error “mapping values are not allowed here”?

我正在嘗試打開,解析,然后將我的YAML文件傳遞到Python腳本中的dict中。 但是,我似乎無法在允許對其進行解析的簡單文本編輯器中格式化文件本身。 我一直在YAML文本文件中的同一位置獲取mapping values are not allowed here的錯誤mapping values are not allowed here 我試圖以各種方式重新格式化它,但是我一直在同一地方遇到相同的錯誤。 我的代碼設置如下:

from __future__ import print_function
import ruamel.yaml as ry

with open("yamltest2.yaml", 'r') as stream:
    try:
        print(ry.load(stream, Loader= ry.Loader))
    except ry.YAMLError as exc:
        print(exc)

而且我的YAML文本文件本身是這樣設置的(注意:我的IDE通知我,錯誤源始終出現在name:為的行的末尾):

input = """\
name: 
    a: 1 # comment
    b: 2
    c: 3
    d: 4
"""

有人可以幫助我確定導致此錯誤的根本原因嗎?

您正在yamltest2.yaml中混合使用Python和YAML。 代替

input = """\
name: 
    a: 1 # comment
    b: 2
    c: 3
    d: 4
"""

您的.yaml文件應如下所示:

name: 
    a: 1 # comment
    b: 2
    c: 3
    d: 4

您的IDE可能正在解析您所得到的全部錯誤, ruamel.yaml錯誤,其中包含文件出現錯誤的確切位置:

mapping values are not allowed here
  in "yamltest2.yaml", line 2, column 5

這是因為您使用跨多(兩)行的標量“ input =“”“ \\ name”(這里的\\ 不是轉義的反斜杠)啟動YAML文件,但是隨后將該標量用作映射中的鍵。這在YAML中是不允許的。

如果您希望擁有確切的密鑰,則只需指定:

input = """\ name:
    a: 1 # comment
    b: 2
    c: 3
    d: 4

不過,您必須從文件中刪除結尾的""" ,因為這是一個沒有值的不完整鍵,會引發另一個錯誤。

但這不是您想要的,您可能試圖從以下程序中外包嵌入式YAML字符串:

from __future__ import print_function
import ruamel.yaml as ry

input = """\
name: 
    a: 1 # comment
    b: 2
    c: 3
    d: 4
"""

try:
    print(ry.load(input, Loader= ry.Loader))
except ry.YAMLError as exc:
    print(exc)

並且在編輯副本時將所有已刪除的行粘貼到您的YAML中。 正如@errata已經指出的那樣,這不是YAML。 如果您不能立即自己解決這些問題,那么您當然可以在[so]上提問,但是一個通常可以幫助查明問題出在哪里的技巧是刪除所有從錯誤點開始的內容,並檢查在截斷的YAML時加載的數據。加載沒有問題。 在您的情況下,您的YAML需要被截斷為:

input = """\
name

它以input = """\\ name而不是您期望的dict。

但是,您的代碼還有另一個問題應解決:您不應使用標准load() 當不加ruamel.yaml使用load()時,在ruamel.yaml發出警告是有原因的,因為使用load()很危險。 您可以像這樣做一樣避免執行load(stream, Loader=ruamel.yaml.Loader)的警告,或通過以下方式取消警告:

import warnings
warnings.simplefilter('ignore', ruamel.yaml.error.UnsafeLoaderWarning)

但是我在這里重復我在警告消息ruamel.yaml給出的建議,該建議在不加ruamel.yaml使用:use safe_load() 您沒有理由不這樣做

from __future__ import print_function
import ruamel.yaml as ry

with open("yamltest2.yaml", 'r') as stream:
    try:
        print(ry.safe_load(stream))
    except ry.YAMLError as exc:
        print(exc)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM