Skip to main content
 首页 » 编程设计

python-3.x之yaml 八进制整数生成错误

2025年05月04日16xiaohuochai

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

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

根据YAML 1.2 specification section 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()