web-dev-qa-db-fra.com

La lecture du fichier YAML avec Python résulte en AttributeError

J'essaie de créer un script pour sauvegarder une base de données MySQL. J'ai un config.yml fichier:

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

Maintenant, je dois lire ce fichier. Mon Python jusqu'à présent:

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

Et voici l'erreur qui se produit:

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

Quelqu'un a-t-il une idée où j'ai fait une erreur?

11
Yerlan Yeszhanov

Il y a 2 problèmes:

  • Comme d'autres l'ont dit, yaml.load () charge les tableaux associatifs en tant que mappages, vous devez donc utiliser config['DB_NAME'].
  • La syntaxe de votre fichier de configuration n'est pas correcte: en YAML, les clés sont séparées des valeurs par deux points + espace.

Devrait fonctionner si le fichier est formaté comme ceci:

DB_Host: 'localhost'
DB_USER: 'root'
DB_USER_PASSWORD: 'P@$$w0rd'
DB_NAME: 'moodle_data'
BACKUP_PATH: '/var/lib/mysql/moodle_data'
11
Roel Schroeven

Pour sauvegarder votre base de données , vous devriez pouvoir l'exporter sous forme de fichier .sql. Si vous utilisez une interface spécifique, recherchez Export.

Ensuite, pour l'analyseur yaml de Python.

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

est une chose key-value (désolé, je n'ai pas trouvé de meilleur mot pour celui-là). Dans certains langages (comme PHP je pense), ils sont convertis en objets. En python cependant, ils sont convertis en dicts (l'analyseur yaml le fait, l'analyseur JSON aussi).

# 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

Donc, c'est une présentation très rapide des dict, mais si vous vous lancez (exécutez help(dict), et/ou jetez un œil ici vous ne le regretterez pas)

Dans ton cas:

config['DB_NAME'] # moodle_data
2
math2001

Essaye ça:

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

Pour accéder à "DB_NAME", vous pouvez utiliser:

txt = doc["DB_NAME"]
print txt
0
Shivkumar kondi