【问题标题】:PyYAML error: "yaml.scanner.ScannerError: mapping values are not allowed here"PyYAML 错误:“yaml.scanner.ScannerError:此处不允许映射值”
【发布时间】:2015-12-14 23:34:43
【问题描述】:

我在解析 YAML 时遇到一个奇怪的错误:

yaml.scanner.ScannerError: mapping values are not allowed here

根据YAML Lint,我尝试读取的 YAML 文件是有效的

另一个奇怪的事情是它在我的笔记本电脑(Arch Linux)上运行良好,但在服务器(Ubuntu)上却不行。 PyYAML 版本在两台机器上是相同的。

我见过the other posts on stackoverflow where people were missing the space after the colon,但我没有遗漏任何空格。

这是完整的 YAML 文件:

pipeline:
    - read:
            input: /home/omnibrain/projects/company/data/data.csv
            output: some_data
    - filter:
            input: some_data
            filtername: latlng_filter
            minlat: 32.5
            maxlat: 32.9
            minlng: -117.4
            maxlng: -117.0
    - enhance:
            input: some_data
            enhancername: geo_enhancer
            fields: zip
    - write:
            input: some_data
            writername: csv_writer
            output_dir: /home/omnibrain/outputs
            columns: [id, latitude, longitude, zip, networktype]
            filename: example1 # the output filename

这是完整的堆栈跟踪:

Traceback (most recent call last):
  File "/usr/local/bin/someproject", line 9, in <module>
    load_entry_point('someproject==0.0.1', 'console_scripts', 'someproject')()
  File "/usr/local/lib/python3.4/dist-packages/someproject-0.0.1-py3.4.egg/someproject/__init__.py", line 19, in main
    pipeline.Pipeline(parser.parse_args().scriptfile).start()
  File "/usr/local/lib/python3.4/dist-packages/someproject-0.0.1-py3.4.egg/someproject/pipeline/pipeline.py", line 20, in __init__
    self._raw_pipeline = self._parse_yaml(yamlscript)
  File "/usr/local/lib/python3.4/dist-packages/someproject-0.0.1-py3.4.egg/someproject/pipeline/pipeline.py", line 55, in _parse_yaml
    data = yaml.load(yamlscript)
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/__init__.py", line 72, in load
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/constructor.py", line 35, in get_single_data
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 36, in get_single_node
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 55, in compose_document
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 84, in compose_node
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 133, in compose_mapping_node
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 82, in compose_node
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 111, in compose_sequence_node
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 84, in compose_node
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 133, in compose_mapping_node
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 84, in compose_node
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/composer.py", line 127, in compose_mapping_node
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/parser.py", line 98, in check_event
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/parser.py", line 428, in parse_block_mapping_key
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/scanner.py", line 116, in check_token
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/scanner.py", line 220, in fetch_more_tokens
  File "/usr/local/lib/python3.4/dist-packages/PyYAML-3.11-py3.4-linux-x86_64.egg/yaml/scanner.py", line 580, in fetch_value
yaml.scanner.ScannerError: mapping values are not allowed here
  in "./test1.yaml", line 3, column 93

【问题讨论】:

  • 在第 3 行我没有看到 93 列的文本。只有大约 60。所以也许这是一个石灰打破问题。尝试检查行尾。

标签: python yaml python-3.4 pyyaml


【解决方案1】:

冒号后没有遗漏任何空格,以input: /home/omnibrain/projects/company/data/data.csv 开头的行中有太多 个空格。这就是为什么您会看到第 3 行第 93 列

整行内容如下:

      input: /home/omnibrain/projects/company/data/data.csv                           output: some_data

它还应该有一些有趣的字符与你的显示混淆,因为通常你会看到一个字符串

...                           output: some_data

低于此处不允许的映射。

如果文件看起来相同,通常会出现这种差异,但实际上并非如此,例如从一个终端复制并粘贴到另一个终端后。或者粘贴到 YAMLlint 之类的网站之后。

在两个系统上为文件生成一个md5sum,以检查它们是否真的相同。在 YAML 文件上使用 od -c 来检查它是否有奇怪的字符。

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2014-12-13
    • 2019-10-27
    • 2019-08-16
    相关资源
    最近更新 更多