2017-02-01 37 views
5

我是Python新手。我试图做一个脚本来备份mysql数据库。我有config.yml文件如何从Python中的yaml文件读取

DB_HOST :'localhost' 
DB_USER : 'root' 
DB_USER_PASSWORD:'[email protected]$$w0rd' 
DB_NAME : 'moodle_data' 
BACKUP_PATH : '/var/lib/mysql/moodle_data' 

现在我需要阅读这个文件。

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' 

有没有人有一个想法,我犯了错误?

+0

欢迎SO BTW。问题可能很简单,格式很好,所有有用的元素都在这里。享受您的逗留,并且当您的问题得到完全解答时,请不要忘记标记答案为已批准:) – spectras

+0

您不应该使用'yaml.load()',因为它可能是不安全的,并且从您的问题看起来您不喜欢如果你受到影响,没有经验可以正确判断(改用'.safeload()')。如果读取'config.yml'会引发错误(解析时),那么你的代码也有问题,在这种情况下你的文件可能没有被正确关闭。你应该使用'with'语句 – Anthon

回答

6

有2个问题:

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

如果该文件的格式像这应该工作:

DB_HOST: 'localhost' 
DB_USER: 'root' 
DB_USER_PASSWORD: '[email protected]$$w0rd' 
DB_NAME: 'moodle_data' 
BACKUP_PATH: '/var/lib/mysql/moodle_data' 
0

试试这个:

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

要访问 “DB_NAME” 你可以使用:

txt = doc["DB_NAME"] 
print txt 
+0

它说TypeError:字符串索引必须是整数,而不是str –

1

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

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

DB_HOST :'localhost' 
DB_USER : 'root' 
DB_USER_PASSWORD:'[email protected]$$w0rd' 
DB_NAME : 'moodle_data' 
BACKUP_PATH : '/var/lib/mysql/moodle_data' 

key-value东西(抱歉,没有找到一个更好的词)。在某些语言中(比如我认为的PHP),它们被转换为对象。但在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),和/或看看here你会不会后悔)

在您的情况:

config['DB_NAME'] # moodle_data 
+0

“JSON编译器”实际上没有意义,因为解析JSON文档会产生数据结构,而不是程序。我想你的意思是JSON解析器,更具体地说,是python的默认json解析器。坚持使用[正确的工具](https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html)进行数据库备份的好点。 – spectras

+1

哎呦......谢谢,修好了! – math2001

+0

import yaml config = yaml.load(open('config.yml')) db = config ['DB_NAME'] print db still TypeError出现“字符串索引必须是整数,而不是str” –