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