Python 操作配置文件

代码开发都在测试环境中,投入生产环境时运维人员不会去修改你的代码(如修改数据库连接相关信息),此时就需要提供一个相应的配置文件,供给运维人员修改。此处记录一下python操作配置文件的方法。

参考:https://www.jianshu.com/p/5f1e1bc3fbe2

介绍:

文件格式

  • 配置文件中包含一个或多个 section,每个 section 都有自己的 option;
  • section 用 [sect_name] 表示,每个 option 是一个键值对,使用分隔符 = 或者 : 隔开;
  • option 分隔符两端的空格会被忽略掉;
  • 配置文件使用 # 注释;

示例配置文件 dbconf.cfg;

[dbconfig]
# 数据库读库链接信息
host=127.0.0.1
user=root
passwd=root
database=banma_finance
port=3306

示例配置文件 book.info

[book]
# 标题
title: Core Python
version: 2016009021
[hardcopy]
pages:350

 

1.安装包 : 命令conda info configparser 查看包信息,若无相应的配置文件解析包则安装:conda install configparser

2.读取配置文件

import configparser
#实例化配置文件解析器并加载文件
dbconf = configparser.ConfigParser()
dbconf.read('dbconf.cfg')
#访问其中所有的sections和option
for section in dbconf.sections():
    print(dbconf.sections())
    for option in dbconf.options(section):
        print('{} = {}'.format(option,dbconf.get(section,option)))

输出结果:

['dbconfig']
host = 127.0.0.1
user = root
passwd = 
database = test
port = 3306

3.写配置文件

import configparser
import sys
#写配置文件
#初始化配置解析器
dbconf_write = configparser.ConfigParser()
#添加 newdbconf section
dbconf_write.add_section('newdbconf')
#添加newdbconf下的option host和port的配置
dbconf_write.set('newdbconf','host','127.0.0.1')
dbconf_write.set('newdbconf','port','3306')
#将配置文件输出到标准输出
dbconf_write.write(sys.stdout)
#将配置信息输出到文件
dbconf_write.write(open('dbconf.cfg','w'))

4.贴一段读配置文件链接数据库的代码

import pymysql
import pandas
import configparser


#面向对象的方法来进行数据库查询等操作
class SqlSearch():
    def __init__(self,page,page_size):
        self.page = page
        self.page_size = page_size
    def get_conf(self):
        '''
        获取数据库配置信息
        :return:
        '''
        # 实例化配置文件解析器并加载文件
        dbconf = configparser.ConfigParser()
        dbconf.read('dbconf.cfg')
        # 获取配置信息
        self.host = dbconf.get('dbconf','host')
        self.user = dbconf.get('dbconf','user')
        self.passwd = dbconf.get('dbconf','passwd')
        self.db = dbconf.get('dbconf','database')
        self.port = dbconf.get('dbconf','port')

    def get_conn(self):
        '''
        连接数据库
        :return:
        '''
        #获取配置信息
        self.get_conf()
        try:
            self.conn = pymysql.connect(host=self.host, user=self.user, password=self.passwd,
                                        port=int(self.port), charset='utf8',db=self.db)
        except pymysql.Error as e:
            print(e)
            print('数据库连接失败')

    def close_conn(self):
        '''
        关闭数据库
        :return:
        '''
        try:
            if self.conn:
                self.conn.close()
        except pymysql.Error as e:
            print(e)
            print('关闭数据库失败')

    def get_one(self):
        '''
        查询一条数据
        :return:
        '''
        try:
            self.get_conn()
            #查询语句
            sql = 'select * from student where age=%d'
            #游标执行sql语句
            my_cursor = self.conn.cursor()
            my_cursor.execute(sql,18)
            one  = my_cursor.fetchone()
            #将一条数据转为字典
            #[x[0] for x in my_cursor.description] 字段名列表,[x for x in one]字段值
            new_dict = dict(zip([x[0] for x in my_cursor.description],[x for x in one]))
            #关闭游标
            my_cursor.close()
            self.close_conn()
        except pymysql.Error as e:
            print(e)
        return None

    def get_all(self):
        '''
        获取查询到的所有数据,并将数据读到pandas dataframe中
        :return:
        '''
        try:
            self.get_conn()
            sql = 'select * from student'
            df = pandas.read_sql(sql,self.conn,index_col='student_id')
            print(df)
            self.close_conn()
        except pymysql.Error as e :
            print(e)
        return df

    def get_more_by_page(self):
        '''
        根据页数来查询指定的数据数量
        :return:
        '''
        offset = (self.page-1)*self.page_size
        #sql = 'select * from emp_tt limit ' + str(offset)+','+ str(self.page_size) #加号多时拼接效率低
        #sql = 'select * from emp_tt limit {},{}'.format(offset,self.page_size)
        sql = 'select * from emp_tt limit %s,%s' % (offset,self.page_size)
        try:
            self.get_conn()
            df_data = pandas.read_sql(sql,self.conn)
            print(df_data)
            self.close_conn()
        except AttributeError as e:
            print(e)
        return df_data


my_sql = SqlSearch(1,5)
my_sql.get_all()
print('successfully!')
my_sql.get_more_by_page()

猜你喜欢

转载自blog.csdn.net/u013344884/article/details/81224213