标签: pyyaml

为什么PyYAML在解析YAML文件时花了这么多时间?

我使用以下格式解析大约6500行的YAML文件:

foo1:
  bar1:
    blah: { name: "john", age: 123 }
  metadata: { whatever1: "whatever", whatever2: "whatever" }
  stuff:
    thing1: 
      bluh1: { name: "Doe1", age: 123 }
      bluh2: { name: "Doe2", age: 123 }
    thing2:
    ...
    thingN:
foo2:
...
fooN:
Run Code Online (Sandbox Code Playgroud)

我只想用PyYAML库解析它(我认为在Python中没有其他替代方法:我如何在Python中解析YAML文件).

只是为了测试,我编写代码来解析我的文件:

import yaml

config_file = "/path/to/file.yaml"

stream = open(config_file, "r")
sensors = yaml.load(stream)
Run Code Online (Sandbox Code Playgroud)

使用time命令执行脚本以及我这次得到的脚本:

real    0m3.906s
user    0m3.672s
sys     0m0.100s
Run Code Online (Sandbox Code Playgroud)

那些价值看起来并不太好.我只想用JSON测试相同的内容,只需将相同的YAML文件转换为JSON:

import json

config_file = "/path/to/file.json"

stream = open(config_file, "r")
sensors = …
Run Code Online (Sandbox Code Playgroud)

python json yaml pyyaml

10
推荐指数
1
解决办法
2407
查看次数

使用PyYAML将文档作为原始字符串加载到yaml中

我想解析下面的yaml文档

meta-info-1: val1
meta-info-2: val2

---

Plain text/markdown content!
jhaha
Run Code Online (Sandbox Code Playgroud)

如果我load_all使用PyYAML,我会得到以下内容

>>> list(yaml.load_all(open('index.yml')))
[{'meta-info-1': 'val1', 'meta-info-2': 'val2'}, 'Plain text/markdown content! jhaha']
Run Code Online (Sandbox Code Playgroud)

我在这里想要实现的是yaml文件应该包含两个文档,第二个应该被解释为单个字符串文档,更具体地说是任何带有markdown格式的大文本.我不希望它被解析为YAML语法.

在上面的示例中,PyYAML将第二个文档作为单个字符串返回.但是如果第二个文档有一个:字符代替!例如,我会收到语法错误.这是因为PyYAML正在解析该文档中的内容.

有没有办法告诉PyYAML第二个文件只是一个原始字符串而不是解析它?

编辑:那里有一些很好的答案.虽然使用引号或文字语法解决了上述问题,但我希望用户能够在没有任何额外错误的情况下编写纯文本.只是三个-(或.'s)并写下大量纯文本.其中也可能包含引号.所以,我想知道我是否可以告诉PyYAML只解析一个文档,然后给我第二个文档.

Eidt 2:所以,调整agf的想法,而不是使用try/except,因为第二个文档可能是有效的yaml语法,

config_content, body_content = open(filename).read().split('\n---')
config = yaml.loads(config_content)
body = yaml.loads(body_content)
Run Code Online (Sandbox Code Playgroud)

谢谢agf.

python yaml pyyaml

9
推荐指数
1
解决办法
2万
查看次数

强制pyYAML一致地转储

In [136]: a = [1,2,3,4,5]

In [137]: print yaml.dump(a)
[1, 2, 3, 4, 5]


In [138]: a = [1,2,3,4,5, [1,2,3]]

In [139]: print yaml.dump(a)
- 1
- 2
- 3
- 4
- 5
- [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

为什么上述两种产出dumps不同?是否有可能强制pyYAML分裂list总是?

python yaml pyyaml

9
推荐指数
1
解决办法
6190
查看次数

如何将数据附加到 YAML 文件

我有一个文件 *.yaml内容如下:

bugs_tree:
  bug_1:
    html_arch: filepath
    moved_by: user1
    moved_date: '2018-01-30'
    sfx_id: '1'
Run Code Online (Sandbox Code Playgroud)

我想在节点下的这个文件中添加一个新的子元素 [bugs_tree] 我尝试执行此操作如下所示:

if __name__ == "__main__":
    new_yaml_data_dict = {
        'bug_2': {
            'sfx_id': '2', 
            'moved_by': 'user2', 
            'moved_date': '2018-01-30', 
            'html_arch': 'filepath'
        }
    }

    with open('bugs.yaml','r') as yamlfile:
        cur_yaml = yaml.load(yamlfile)
        cur_yaml.extend(new_yaml_data_dict)
        print(cur_yaml)
Run Code Online (Sandbox Code Playgroud)

然后文件应该看起来:

bugs_tree:
  bug_1:
    html_arch: filepath
    moved_by: username
    moved_date: '2018-01-30'
    sfx_id: '1234'
  bug_2:
    html_arch: filepath
    moved_by: user2
    moved_date: '2018-01-30'
    sfx_id: '2'
Run Code Online (Sandbox Code Playgroud)

当我尝试执行.append()OR .extend()OR 时.insert()出现错误

cur_yaml.extend(new_yaml_data_dict)
AttributeError: 'dict' object has no attribute 'extend'
Run Code Online (Sandbox Code Playgroud)

python yaml pyyaml

9
推荐指数
2
解决办法
2万
查看次数

如何在 python 中将 pandas DataFrame 转换为 YAML

import yaml
import pandas as pd

data = ['apple','car','smash','market','washing']
bata = ['natural','artificail','intelligence','outstanding','brain']

df = pd.DataFrame(zip(data,bata),columns=['Data','Bata'])

for columns in df:
    for list in df[columns]:
        text = yaml.dump_all(list)
        print(text)
Run Code Online (Sandbox Code Playgroud)

我使用了上面的代码,但我打印了每封信。如何获得良好的 YAML 格式。谢谢。

yaml pyyaml dataframe python-3.x

9
推荐指数
1
解决办法
1万
查看次数

如何从纯python创建一个yaml文件?

使用YAML和Python的示例

原始YAML文件包含此内容

# tree format
treeroot:
    branch1:
        name: Node 1
        branch1-1:
            name: Node 1-1
    branch2:
        name: Node 2
        branch2-1:
            name: Node 2-1
Run Code Online (Sandbox Code Playgroud)

在使用文件加载内容yaml.load()并将其转储到新的YAML文件后,我得到了这个:

# tree format
treeroot:
    branch1:
        branch1-1: {name:Node 1-1}
        name: Node 1
    branch2:
        branch2-1: {name: Node 2-1}
        name: Node 2
Run Code Online (Sandbox Code Playgroud)

直接从纯python构建YAML文件的正确方法是什么?我不想自己写字符串.我想建立字典和列表.


部分...

dataMap = {'treeroot':
               {'branch2': 
                 {'branch1-1': 
                  {'name': 'Node 1-1'},   # should be its own level
                  'name': 'Node 1'
                 }
               }
          }
Run Code Online (Sandbox Code Playgroud)

python yaml pyyaml

8
推荐指数
1
解决办法
1万
查看次数

何时使用 YAML 而不是 JSON

YAML 似乎比 JSON 格式的对象更具可读性,除了可读性之外,PyAML 代替 JSON 有什么优点或缺点?我们应该如何在两者之间做出决定,请注意,我不是在问两者之间的区别,而是关于为什么以及何时使用另一个的建议?

json yaml pyyaml

8
推荐指数
1
解决办法
5543
查看次数

pyyaml safe_load:如何忽略本地标签

我正在使用yaml.safe_load()但我需要忽略标签!v2- 有没有办法做到这一点但仍然使用safe_load()

python yaml pyyaml

8
推荐指数
2
解决办法
3982
查看次数

如何在Windows 10上安装pyYAML

我试图在Windows 10上从源安装pyYAML.我从https://pypi.python.org/pypi/PyYAML下载了PyYAML 3.11 .当我运行setup.py时出现错误:[WinError 2]系统找不到指定的文件.怎么解决?

PyYAML-3.11>python setup.py install
running install
running build
running build_py
creating build
creating build\lib.win-amd64-3.5
creating build\lib.win-amd64-3.5\yaml
copying lib3\yaml\composer.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\constructor.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\cyaml.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\dumper.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\emitter.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\error.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\events.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\loader.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\nodes.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\parser.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\reader.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\representer.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\resolver.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\scanner.py -> build\lib.win-amd64-3.5\yaml
copying lib3\yaml\serializer.py …
Run Code Online (Sandbox Code Playgroud)

python windows pyyaml

8
推荐指数
1
解决办法
2万
查看次数

pyyaml并仅使用字符串引号

我有以下YAML文件:

---
my_vars:
  my_env: "dev"
  my_count: 3
Run Code Online (Sandbox Code Playgroud)

当我用PyYAML读取它并再次转储它时,我得到以下输出:

---
my_vars:
  my_env: dev
  my_count: 3
Run Code Online (Sandbox Code Playgroud)

有问题的代码:

with open(env_file) as f:
    env_dict = yaml.load(f)
    print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True))
Run Code Online (Sandbox Code Playgroud)

我尝试使用default_style参数:

with open(env_file) as f:
    env_dict = yaml.load(f)
    print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True, default_style='"'))
Run Code Online (Sandbox Code Playgroud)

但现在我得到:

---
"my_vars":
  "my_env": "dev"
  "my_count": !!int "3"
Run Code Online (Sandbox Code Playgroud)

不对 YAML文件中的变量名做任何假设的情况下,我需要做什么来保持原始格式?

python quotes pyyaml

8
推荐指数
3
解决办法
7583
查看次数

标签 统计

pyyaml ×10

python ×8

yaml ×8

json ×2

dataframe ×1

python-3.x ×1

quotes ×1

windows ×1