2017-02-01 3 views
5

Ich bin neu in Python. Ich versuche ein Skript zu erstellen, um die MySQL-Datenbank zu sichern. Ich habe config.yml DateiWie aus YAML-Datei in Python lesen

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

Jetzt muss ich diese Datei lesen.

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

Und hier ist ein Fehler kommt auf.

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

Hat jemand eine Idee, wo ich Fehler gemacht habe?

+0

Willkommen bei SO. Die Frage mag einfach sein, die Formatierung ist gut und alle nützlichen Elemente sind hier. Genießen Sie Ihren Aufenthalt und vergessen Sie nicht, eine Antwort als genehmigt zu markieren, wenn Ihre Frage vollständig beantwortet wird. – spectras

+0

Sie sollten 'yaml.load()' nicht verwenden, da es unsicher sein kann und aus Ihrer Frage sieht es so aus, als ob Sie es nicht tun Wenn Sie betroffen sind oder nicht, sollten Sie keine Erfahrung mit der Beurteilung haben (verwenden Sie stattdessen ".safeload()"). Ihr Code hat auch ein Problem, wenn das Lesen von 'config.yml' einen Fehler (beim Parsen) auslöst. In diesem Fall wird Ihre Datei möglicherweise nicht ordnungsgemäß geschlossen.Sie sollten die Anweisung 'with' verwenden – Anthon

Antwort

6

Es gibt zwei Probleme:

  • Wie andere gesagt haben, yaml.load() lädt asso ciative arrays als Mappings, also müssen Sie config['DB_NAME'] verwenden.
  • Die Syntax in Ihrer Konfigurationsdatei ist nicht korrekt: In YAML sind Schlüssel von Werten durch einen Doppelpunkt + Leerzeichen getrennt.

Sollte funktionieren, wenn die Datei wie folgt formatiert ist:

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

Try this:

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

Für den Zugriff auf "DB_NAME" Sie verwenden können:

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

es sagt TypeError: string-Indizes müssen ganze Zahlen sein, nicht str –

1

Um ein Backup Ihrer Datenbank, sollten Sie in der Lage sein, es als .sql Datei zu exportieren. Wenn Sie eine bestimmte Schnittstelle verwenden, suchen Sie nach Export.

Dann für Python Yam Parser.

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

ist eine key-value Sache (sorry, nicht ein besseres Wort für diesen einen finden). In bestimmten Sprache (wie PHP denke ich), werden sie in Objekte konvertiert. In Python jedoch werden sie in dicts konvertiert (YAML-Parser tut es, JSON-Parser auch).

# 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 

Also, das ist eine wirklich schnelle Präsentation von dicts, aber das sollten Sie Sie (help(dict) laufen, und/oder einen Blick here Sie es nicht bereuen werden) gehen

In Ihrem Fall:

config['DB_NAME'] # moodle_data 
+0

" JSON-Compiler "macht keinen Sinn, da die Analyse eines JSON-Dokuments eine Datenstruktur erzeugt, kein Programm. Ich nehme an, Sie meinten JSON-Parser und genauer gesagt den Standard-Json-Parser von Python. Guter Punkt besteht darauf, [das richtige Werkzeug] (https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html) für db backup btw zu verwenden. – spectras

+1

Hoppla ... Danke, repariere es! – math2001

+0

importieren yaml config = yaml.load (öffnen ('config.yml')) db = config ['DB_NAME'] Drucken db noch TypeError kommt "string-Indizes müssen ganze Zahlen sein, nicht str" –