2017-02-01 6 views
5

Я новичок в Python. Я пытаюсь создать скрипт для резервного копирования базы данных mysql. У меня есть файл config.ymlКак читать из файла yaml в Python

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 кстати. Вопрос может быть простым, форматирование хорошее, и все полезные элементы здесь. Наслаждайтесь своим пребыванием и не забывайте отмечать ответ, который был одобрен, когда ваш вопрос полностью ответил :) – 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.

Затем для парсера yaml Python.

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 вещи (к сожалению, не нашел лучшее слово для этого один). В определенном langage (например, PHP, я думаю), они преобразуются в объектов. Однако в python они преобразуются в dicts (парсер 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 

Итак, это действительно быстро представление dicts, но вы должны получить вы собираетесь (запустить help(dict), и/или иметь вид here вы не пожалеете)

В вашем случае:

config['DB_NAME'] # moodle_data 
+0

« Компилятор JSON »на самом деле не имеет смысла, поскольку синтаксический анализ документа JSON создает структуру данных, а не программу. Полагаю, вы имели в виду JSON-парсер, а точнее, json-парсер по умолчанию python. Хороший вопрос, настаивающий на использовании [правильного инструмента] (https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html) для резервного копирования bbb. – spectras

+1

Упс ... Спасибо, исправил! – math2001

+0

import yaml config = yaml.load (open ('config.yml')) db = config ['DB_NAME'] print db по-прежнему TypeError появляется "строковые индексы должны быть целыми, а не str" –