在我的YAML文件中,我有以下条目:

- type: dir
  name: .ssh
  chmod: 0o700


根据YAML 1.2 specification节3.2.1.3,0o700是指定八进制的方式(在2.4节中也有一个示例)

但是,当我处理加载的文件并执行以下操作时:

import os
import yaml
filename = "in.yml"

with open(filename) as fp:
    for e in yaml.load(open(filename)):
        if e['type'] == 'dir':
            os.mkdir(e['name'], e['chmod'])


我得到TypeError: an integer is required。这是怎么了?

我正在使用Python 3.5

最佳答案

错是您假设您的YAML库支持最新版本1.2。该YAML版本来自2009,但您使用的是PyYaml,但仍仅支持1.1。从最近几年的无活动状态来看,这似乎是一个沉寂的项目,因此不要指望很快解决这个问题。

你可以加

from yaml.resolver import Resolver

Resolver.add_implicit_resolver(
    'tag:yaml.org,2002:int',
    re.compile(r'''^(?:[-+]?0b[0-1_]+
               |[-+]?0o?[0-7_]+
               |[-+]?0[0-7_]+
               |[-+]?(?:0|[1-9][0-9_]*)
               |[-+]?0x[0-9a-fA-F_]+
               |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X),
    list('-+0123456789'))


在程序中添加对0o123八进制的识别(它仍然可以识别1.1八进制)。

请注意,以上内容仅适用于Python 3,因为PyYaml对于Python 2具有不同的代码。

您还应该考虑使用pathlib.Path类型及其.mkdir()而不是os.mkdir()

关于python-3.x - yaml八进制整数生成错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36514166/

10-09 20:20
查看更多