以前一直对sqlalchemy应用的配置文件, 创建自定义conf.py文件, 把配置写好 如:
DB_SERVER = "mysql+pymysql://root:[email protected]:3306/zhongxinjiantou?charset=utf8"
确实当只有一个连接还好, 要是多个改起来也很麻烦. 看起来还很乱.
看到一本书上写着Python深入掌握configparser类,例子中对sqlalchemy配置提到过,使用Python中字符串格式化可以实现语法:
其实ConfigParser支持
>>> '%(protocol)s://%(server)s:%(port)s/' % { 'protocol':'http', 'server':'example.com',
'port':1080}
>>> 'http://example.com:1080/'
所以就把自己的配置文件全部返工大改:
[DEFAULT]
mysql_url = mysql+pymysql://%(user)s:%(password)s@%(host)s:%(port)s/%(database)s?charset=utf8
mongo_url = mongodb://%(user)s:%(password)s@%(host)s:%(port)s/admin
[DB_SERVER]
host = xxxx
port = 3306
user = xxx
password = xxx
database = xxx
[DB_SERVER_EI_BDP]
host = xxx
port = 3306
user = xxx
password = xxx
database =
xxx
[DB_DATA_SOURCE]
host = xxxx
port = 3306
user = xxx
password = xxx
database = xxxx
python2下该模块名为ConfigParser,到3才改为configparser,可以看官方ConfigParser模块的说明
https://docs.python.org/2/library/configparser.html
本文介绍python3中configparser模块的使用,configparser模块是用来解析ini配置文件的解析器,关于ini配置文件的结构可以看python官方文档中的介绍:
ini文件结构
ini文件结构需要注意一下几点:
=
或者:
进行分隔section
的名字是区分大小写的,而key
的名字是不区分大小写的#
或者;
为前缀注意:configparser有default_section的概念,默认为[DEFAULT]
节,也就是之后的所有的section都有该默认section中的键值对,详情参见configparser源码的__init__()
方法
为了创建如下ini文件:
configparser模块主要使用ConfigParser类来解析ini文件
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no
我们可以使用如下代码:
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config['DEFAULT'] = {'ServerAliveInterval': '45',
... 'Compression': 'yes',
... 'CompressionLevel': '9'}
>>> config['bitbucket.org'] = {}
>>> config['bitbucket.org']['User'] = 'hg'
>>> config['topsecret.server.com'] = {}
>>> topsecret = config['topsecret.server.com']
>>> topsecret['Port'] = '50022' # mutates the parser
>>> topsecret['ForwardX11'] = 'no' # same here
>>> config['DEFAULT']['ForwardX11'] = 'yes'
>>> with open('example.ini', 'w') as configfile:
... config.write(configfile)
然后我们再读取该ini文件:
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['bitbucket.org', 'topsecret.server.com']
>>> 'bitbucket.org' in config
True
>>> 'bytebong.com' in config
False
>>> config['bitbucket.org']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.com']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
'50022'
>>> for key in config['bitbucket.org']: print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['bitbucket.org']['ForwardX11']
'yes'
The only bit of magic involves the DEFAULT section which provides default values for all other sections. Note also that keys in sections are case-insensitive and stored in lowercase
除了可以使用列表的方式获取值,也可以通过section
级别的get()
方法获取,同时该函数可以指定默认值
>>> topsecret.get('Port')
'50022'
>>> topsecret.get('CompressionLevel')
'9'
>>> topsecret.get('Cipher', '3des-cbc')
'3des-cbc'
而解析器级别的get()
函数的默认值是通过fallback
参数指定的:
>>> config.get('bitbucket.org', 'monster',
... fallback='No such things as monsters')
'No such things as monsters'
需要注意的是,无论是通过列表方式获取值,还是通过get()
方法获取值,获取到的数据都字符串类型,如果想要获取指定类型的数据,可以使用如下的几个方法:
同时需要注意getboolean()
方法能判断True/False的值有: ‘yes’/‘no’, ‘on’/‘off’, ‘true’/‘false’ 和 ‘1’/‘0’
创建ConfigParser()类的时候可以指定interpolation参数,如果将interpolation设置为BasicInterpolation()
,则配置文件中的%(key)s
结构会被解析,如,比如example.ini
文件内容如下:
[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures
>>> import configparser
>>> config = configparser.ConfigParser(interpolation=configparser.BasicInterpolation())
>>> config.read(r'F:\coding\python\example.ini')
['F:\\coding\\python\\example.ini']
>>> config['Paths']['my_dir']
'/Users/lumberjack'
可以看到%(home_dir)s
被解析成了/Users
,说白了,相当于配置文件中的变量
创建ConfigParser()类的时候如果没有指定interpolation参数,则不会解析%(key)s
,只会返回字符串而已
>>> config['Paths']['my_dir']
'%(home_dir)s/lumberjack'
当然Interpolation还有更高级的使用方法,创建ConfigParser()类的时候指定interpolation参数为ExtendedInterpolation()
,那么解析器会解析${section:key}
结构,那么上面的ini文件应该写成如下的格式:
[Paths]
home_dir: /Users
my_dir: ${home_dir}/lumberjack
my_pictures: ${my_dir}/Pictures
并且ExtendedInterpolation()
也能解析更复杂的,像下面这样的ini文件:
[Common]
home_dir: /Users
library_dir: /Library
system_dir: /System
macports_dir: /opt/local
[Frameworks]
Python: 3.2
path: ${Common:system_dir}/Library/Frameworks/
[Arthur]
nickname: Two Sheds
last_name: Jackson
my_dir: ${Common:home_dir}/twosheds
my_pictures: ${my_dir}/Pictures
python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
ConfigParser对象的其他方法,如:
都很常用,具体就不介绍了,看名字就知道是干什么的了