在我的 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()