使用 Python 读取 YAML 文件导致 AttributeError

新手上路,请多包涵

我正在尝试制作一个脚本来备份 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'

有谁知道我在哪里犯了错误?

原文由 Yerlan Yeszhanov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

有2个问题:

  • 正如其他人所说, 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'

原文由 Roel Schroeven 发布,翻译遵循 CC BY-SA 3.0 许可协议

要备份您的数据库,您应该能够将其导出为 .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),它们被转换为 objects 。但是在 python 中,它们被转换为 _字典_(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

所以,这是一个非常快速的听写介绍,但是你应该开始(运行 help(dict) ,和/或看看 这里 你不会后悔的)

在你的情况下:

 config['DB_NAME'] # moodle_data

原文由 math2001 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题