在我的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/