问题描述
我有以下 YAML 文件:
I have the following YAML file:
[mysqld] user: "mysql" pid-file: /var/run/mysqld/mysqld.pid skip-external-locking old_passwords: 1 skip-bdb skip-innodb create_key: yes needs_agent: no knows_oop: True likes_emacs: TRUE women: - Mary Smith - Susan Williams
以及以下 Python 代码:
and the following Python code:
#!/usr/bin/env python import yaml with open("config.yml") as f: sample_config = f.read() print(yaml.load(sample_config))
但它给了我:
Traceback (most recent call last): File "/home/moose/Desktop/bla.py", line 9, in <module> print(yaml.load(sample_config)) File "/usr/local/lib/python2.7/dist-packages/yaml/__init__.py", line 71, in load return loader.get_single_data() File "/usr/local/lib/python2.7/dist-packages/yaml/constructor.py", line 37, in get_single_data node = self.get_single_node() File "/usr/local/lib/python2.7/dist-packages/yaml/composer.py", line 39, in get_single_node if not self.check_event(StreamEndEvent): File "/usr/local/lib/python2.7/dist-packages/yaml/parser.py", line 98, in check_event [Finished in 0.1s with exit code 1] [shell_cmd: python -u "/home/moose/Desktop/bla.py"] [dir: /home/moose/Desktop] [path: /usr/local/texlive/2013/bin/x86_64-linux:/home/moose/google-cloud-sdk/bin:/home/moose/Downloads/google_appengine:/usr/local/texlive/2013/bin/x86_64-linux:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games] self.current_event = self.state() File "/usr/local/lib/python2.7/dist-packages/yaml/parser.py", line 174, in parse_document_start self.peek_token().start_mark) yaml.parser.ParserError: expected '<document start>', but found '<block mapping start>' in "<string>", line 2, column 1: user: "mysql"
我不知道是什么
expected '<document start>', but found '<block mapping start>'
意味着以及如何解决它.什么是<document start>,什么是<block mapping start>?
means and how to fix it. What is <document start> and what is a <block mapping start>?
推荐答案
您的文件不是有效的 YAML.它看起来像是 YAML 和 INI 文件 的混合体.
Your file isn't valid YAML. It looks like a mix of YAML and INI file.
你不能在 YAML 中定义像 [mysql] 这样的块.如果要定义相关属性的集合,请使用带有嵌套键的列表:
You can't define blocks like [mysql] in YAML. If you want to define a collection of related properties, use a list with nested keys:
- service: name: mysql type: database port: 3306 - service: name: ssh type: remote access port: 22
您不能使用 skip-external-locking 之类的裸词.每个属性都需要一个值.请改用 skip-external-locking: true.
You can't have bare words like skip-external-locking. Each property requires a value. Use skip-external-locking: true instead.
这是您的文档的一个版本,其中修正了语法错误.我使用 YAMLLint 进行了检查,这是一个用于验证 YAML 的便捷工具.
Here's a version of your document with the syntax errors fixed. I checked this over with YAMLLint, a handy tool for validating YAML.
name: mysqld user: mysql pid-file: /var/run/mysqld/mysqld.pid skip-external-locking: true old_passwords: 1 skip-bdb: true skip-innodb: true create_key: yes needs_agent: no knows_oop: True likes_emacs: TRUE women: - Mary Smith - Susan Williams