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

使用Python读取YAML文件会导致AttributeError,python,yaml,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.ym

我正在尝试制作一个脚本来备份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'
文件“conf.py”,第4行,在
打印(config.DB_名称)
AttributeError:'str'对象没有属性'DB_NAME'
有人知道我哪里出错了吗?

试试这个:

import yaml
with open('config.yaml', 'r') as f:
    doc = yaml.load(f)
要访问“DB_名称”,您可以使用:

txt = doc["DB_NAME"]
print txt

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

然后,对于Python的yaml解析器

DB_HOST :'localhost'
DB_USER : 'root'
DB_USER_PASSWORD:'P@$$w0rd'
DB_NAME : 'moodle_data'
BACKUP_PATH : '/var/lib/mysql/moodle_data'
是一个
键值
的东西(对不起,没有找到更好的词)。在某些语言中(如PHP),它们被转换为对象。不过,在python中,它们被转换为dicts(yaml解析器也这样做,JSON解析器也这样做)

因此,这是一个非常快速的dicts演示,但如果你开始(运行
帮助(dict)
,和/或看一看,你不会后悔)

就你而言:

config['DB_NAME'] # moodle_data
有两个问题:

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

它说TypeError:string索引必须是整数,而不是strMost可能做的:doc[0]['DB_NAME'],原因是。“JSON编译器”没有真正意义,因为解析JSON文档会生成数据结构,而不是程序。我想您指的是JSON解析器,更具体地说,是python的默认JSON解析器。坚持使用db备份是个好主意,顺便说一句。。。谢谢,修好了!import yaml config=yaml.load(open('config.yml'))db=config['db_NAME']print db still TypeError出现“字符串索引必须是整数,而不是str”欢迎访问。问题可能很简单,格式很好,所有有用的元素都在这里。祝您在这里过得愉快,当您的问题得到完全回答时,不要忘记将答案标记为已批准:)您不应该使用
yaml.load()
,因为它可能不安全,而且从您的问题来看,您似乎没有经验来正确判断您是否受到影响(改为使用
.safeload()
)。如果读取
config.yml
时抛出错误(在解析时),代码也会出现问题,在这种情况下,文件可能无法正确关闭。您应该使用
with
语句
DB_HOST: 'localhost'
DB_USER: 'root'
DB_USER_PASSWORD: 'P@$$w0rd'
DB_NAME: 'moodle_data'
BACKUP_PATH: '/var/lib/mysql/moodle_data'