Python 3.x load返回str而不是dict

Python 3.x load返回str而不是dict,python-3.x,pyyaml,Python 3.x,Pyyaml,使用pyyaml和python3,以下内存中的yaml字符串加载没有错误,但是yaml.full_load()返回str而不是dict。这是预期的行为吗?谢谢 main: orgs: &org1 org1: categories: - one - two - three &org2 org2: categories: - one - two people

使用pyyaml和python3,以下内存中的yaml字符串加载没有错误,但是yaml.full_load()返回str而不是dict。这是预期的行为吗?谢谢

main:
  orgs:
    &org1 org1:
      categories:
        - one
        - two
        - three
    &org2 org2:
      categories:
        - one
        - two
  people:
    - userid: user1
      org: *org1
      roles:
        - roleA
        - roleB
    - userid: user2
      org: *org2
      roles:
        - roleA
MAIN\u YAML=MAIN:orgs:&org1:categories:-一二三&org2org2:categories:-一两个人:-userid:user1org:*org1roles:-roleA-roleB userid:user2org:*org2roles:-roleA
已成功解析
假的
下面是创建一行程序的shell脚本:

tr -d '\n\t' < main.yaml > temp.yaml
tr -d ' ' < temp.yaml > main_squeezed.yaml
MAIN_YAML=$(cat main_squeezed.yaml)
tr-d'\n\t'temp.yaml
tr-d''main_.yaml
MAIN_YAML=$(cat MAIN_.YAML)

您似乎是从没有YAML文件“原样”(带换行符)的环境变量加载它

当字符串中包含换行符时,它会起作用:

>>> s = """main:
...   orgs:
...     &org1 org1:
...       categories:
...         - one
...         - two
...         - three
...     &org2 org2:
...       categories:
...         - one
...         - two
...   people:
...     - userid: user1
...       org: *org1
...       roles:
...         - roleA
...         - roleB
...     - userid: user2
...       org: *org2
...       roles:
...         - roleA"""
>>>
>>> import yaml
>>> yaml.full_load(s)
{'main': {'orgs': {'org1': {'categories': ['one', 'two', 'three']}, 'org2': {'categories': ['one', 'two']}}, 'people': [{'userid': 'user1', 'org': 'org1', 'roles': ['roleA', 'roleB']}, {'userid': 'user2', 'org': 'org2', 'roles': ['roleA']}]}}
当字符串是一行文本时,它不起作用:

>>> t = s.replace('\n', '').replace(' ', '')  # same thing, but one line
>>> yaml.full_load(t)
'main:orgs:&org1org1:categories:-one-two-three&org2org2:categories:-one-twopeople:-userid:user1org:*org1roles:-roleA-roleB-userid:user2org:*org2roles:-roleA'

啊,是的,我正在将它作为文件中的一个ENV变量传递给Docker容器,并且换行符正在被剥离,因此它适合一行。下面是生成一行程序的shell脚本。tr-d'\n\t'temp.yaml tr-d'main\u压缩的main\u yaml=$(cat main\u压缩的.yaml)
>>> s = """main:
...   orgs:
...     &org1 org1:
...       categories:
...         - one
...         - two
...         - three
...     &org2 org2:
...       categories:
...         - one
...         - two
...   people:
...     - userid: user1
...       org: *org1
...       roles:
...         - roleA
...         - roleB
...     - userid: user2
...       org: *org2
...       roles:
...         - roleA"""
>>>
>>> import yaml
>>> yaml.full_load(s)
{'main': {'orgs': {'org1': {'categories': ['one', 'two', 'three']}, 'org2': {'categories': ['one', 'two']}}, 'people': [{'userid': 'user1', 'org': 'org1', 'roles': ['roleA', 'roleB']}, {'userid': 'user2', 'org': 'org2', 'roles': ['roleA']}]}}
>>> t = s.replace('\n', '').replace(' ', '')  # same thing, but one line
>>> yaml.full_load(t)
'main:orgs:&org1org1:categories:-one-two-three&org2org2:categories:-one-twopeople:-userid:user1org:*org1roles:-roleA-roleB-userid:user2org:*org2roles:-roleA'