使用Python读取YAML文件会导致AttributeError

时间:2017-02-01 08:00:17

标签: python yaml

我试图创建一个脚本来备份MySQL数据库。我有一个config.yml文件:

DB_HOST :'localhost'
DB_USER : 'root'
DB_USER_PASSWORD:'P@$$w0rd'
DB_NAME : 'moodle_data'
BACKUP_PATH : '/var/lib/mysql/moodle_data'

现在我需要阅读这个文件。到目前为止我的Python代码:

import yaml
config = yaml.load(open('config.yml'))
print(config.DB_NAME)

这是出现的错误:

file "conf.py", line 4, in <module>
print(config.DB_NAME)
AttributeError: 'str' object has no attribute 'DB_NAME'

有没有人知道我犯了哪个错误?

3 个答案:

答案 0 :(得分:11)

有两个问题:

  • 正如其他人所说,yaml.load()将关联数组作为映射加载,因此您需要使用config['DB_NAME']
  • 配置文件中的语法不正确:在YAML中,键与冒号+空格的值分隔。

如果文件格式如下,则应该有效:

DB_HOST: 'localhost'
DB_USER: 'root'
DB_USER_PASSWORD: 'P@$$w0rd'
DB_NAME: 'moodle_data'
BACKUP_PATH: '/var/lib/mysql/moodle_data'

答案 1 :(得分:2)

要备份数据库,您应该可以将其导出为.sql文件。如果您使用的是特定界面,请查找Export

然后,对于Python的yaml解析器。

DB_HOST :'localhost'
DB_USER : 'root'
DB_USER_PASSWORD:'P@$$w0rd'
DB_NAME : 'moodle_data'
BACKUP_PATH : '/var/lib/mysql/moodle_data'

是一个key-value的东西(抱歉,找不到更好的词)。在某些语言(例如我认为的PHP)中,它们被转换为对象。在python中,它们被转换为 dicts (yaml解析器也可以,JSON解析器也是如此)。

# access an object's attribute
my_obj.attribute = 'something cool'
my_obj.attribute # something cool
del my_obj.attribute
my_obj.attribute # error

# access a dict's key's value
my_dict = {}
my_dict['hello'] = 'world!'
my_dict['hello'] # world!
del my_dict['hello']
my_dict['hello'] # error

所以,这是一个非常快速的dicts演示文稿,但是你应该开始(运行help(dict),和/或看看here你不会后悔)

在你的情况下:

config['DB_NAME'] # moodle_data

答案 2 :(得分:0)

试试这个:

import yaml
with open('config.yaml', 'r') as f:
    doc = yaml.load(f)

要访问“DB_NAME”,您可以使用:

txt = doc["DB_NAME"]
print txt