13.10 读��置文件¶
问题¶
æ€Žæ ·è¯»å�–普通.iniæ ¼å¼�çš„é…�置文件?
解决方案¶
configparser 模å�—能被用æ�¥è¯»å�–é…�置文件。例如,å�‡è®¾ä½ 有如下的é…�置文件:
; config.ini
; Sample configuration file
[installation]
library=%(prefix)s/lib
include=%(prefix)s/include
bin=%(prefix)s/bin
prefix=/usr/local
# Setting related to debug configuration
[debug]
log_errors=true
show_warnings=False
[server]
port: 8080
nworkers: 32
pid-file=/tmp/spam.pid
root=/www/root
signature:
=================================
Brought to you by the Python Cookbook
=================================
下é�¢æ˜¯ä¸€ä¸ªè¯»å�–å’Œæ��å�–å…¶ä¸å€¼çš„例å�:
>>> from configparser import ConfigParser
>>> cfg = ConfigParser()
>>> cfg.read('config.ini')
['config.ini']
>>> cfg.sections()
['installation', 'debug', 'server']
>>> cfg.get('installation','library')
'/usr/local/lib'
>>> cfg.getboolean('debug','log_errors')
True
>>> cfg.getint('server','port')
8080
>>> cfg.getint('server','nworkers')
32
>>> print(cfg.get('server','signature'))
\=================================
Brought to you by the Python Cookbook
\=================================
>>>
如果有需è¦�ï¼Œä½ è¿˜èƒ½ä¿®æ”¹é…�置并使用 cfg.write() 方法将其写回到文件ä¸ã€‚例如:
>>> cfg.set('server','port','9000')
>>> cfg.set('debug','log_errors','False')
>>> import sys
>>> cfg.write(sys.stdout)
[installation]
library = %(prefix)s/lib
include = %(prefix)s/include
bin = %(prefix)s/bin
prefix = /usr/local
[debug]
log_errors = False
show_warnings = False
[server]
port = 9000
nworkers = 32
pid-file = /tmp/spam.pid
root = /www/root
signature =
=================================
Brought to you by the Python Cookbook
=================================
>>>
讨论¶
é…�置文件作为一ç§�å�¯è¯»æ€§å¾ˆå¥½çš„æ ¼å¼�,é�žå¸¸é€‚用于å˜å‚¨ç¨‹åº�ä¸çš„é…�置数æ�®ã€‚ 在æ¯�个é…�置文件ä¸ï¼Œé…�置数æ�®ä¼šè¢«åˆ†ç»„(比如例å�ä¸çš„“installationâ€�ã€� “debugâ€� å’Œ “serverâ€�)。 æ¯�ä¸ªåˆ†ç»„åœ¨å…¶ä¸æŒ‡å®šå¯¹åº”çš„å�„个å�˜é‡�值。
对于å�¯å®žçްå�Œæ ·åŠŸèƒ½çš„é…�置文件和Pythonæº�文件是有很大的ä¸�å�Œçš„。 首先,é…�ç½®æ–‡ä»¶çš„è¯æ³•è¦�更自由些,下é�¢çš„赋值è¯å�¥æ˜¯ç‰æ•ˆçš„:
prefix=/usr/local
prefix: /usr/local
é…�置文件ä¸çš„å��å—æ˜¯ä¸�区分大å°�写的。例如:
>>> cfg.get('installation','PREFIX')
'/usr/local'
>>> cfg.get('installation','prefix')
'/usr/local'
>>>
在解æž�值的时候,getboolean() 方法查找任何å�¯è¡Œçš„值。例如下é�¢éƒ½æ˜¯ç‰ä»·çš„:
log_errors = true
log_errors = TRUE
log_errors = Yes
log_errors = 1
或许é…�置文件和Python代ç �最大的ä¸�å�Œåœ¨äºŽï¼Œå®ƒå¹¶ä¸�是从上而下的顺åº�执行。
文件是安装一个整体被读�的。如果碰到了��替�,它实际上已�被替�完�了。
例如,在下é�¢è¿™ä¸ªé…�ç½®ä¸ï¼Œprefix å�˜é‡�在使用它的å�˜é‡�之å‰�或之å�Žå®šä¹‰éƒ½æ˜¯å�¯ä»¥çš„:
[installation]
library=%(prefix)s/lib
include=%(prefix)s/include
bin=%(prefix)s/bin
prefix=/usr/local
ConfigParser 有个容易被忽视的特性是它能一次读�多个�置文件然��并�一个�置。
例如,å�‡è®¾ä¸€ä¸ªç”¨æˆ·åƒ�下é�¢è¿™æ ·æž„é€ äº†ä»–ä»¬çš„é…�置文件:
; ~/.config.ini
[installation]
prefix=/Users/beazley/test
[debug]
log_errors=False
读�这个文件,它就能跟之�的�置�并起�。如:
>>> # Previously read configuration
>>> cfg.get('installation', 'prefix')
'/usr/local'
>>> # Merge in user-specific configuration
>>> import os
>>> cfg.read(os.path.expanduser('~/.config.ini'))
['/Users/beazley/.config.ini']
>>> cfg.get('installation', 'prefix')
'/Users/beazley/test'
>>> cfg.get('installation', 'library')
'/Users/beazley/test/lib'
>>> cfg.getboolean('debug', 'log_errors')
False
>>>
仔细观察下 prefix å�˜é‡�æ˜¯æ€Žæ ·è¦†ç›–å…¶ä»–ç›¸å…³å�˜é‡�的,比如 library 的设定值。
产生这ç§�ç»“æžœçš„åŽŸå› æ˜¯å�˜é‡�的改写采å�–的是å�Žå�‘制人ç–略,以最å�Žä¸€ä¸ªä¸ºå‡†ã€‚
ä½ å�¯ä»¥åƒ�下é�¢è¿™æ ·å�šè¯•验:
>>> cfg.get('installation','library')
'/Users/beazley/test/lib'
>>> cfg.set('installation','prefix','/tmp/dir')
>>> cfg.get('installation','library')
'/tmp/dir/lib'
>>>
最å�Žè¿˜æœ‰å¾ˆé‡�è¦�一点è¦�注æ„�的是Pythonå¹¶ä¸�能支æŒ�.ini文件在其他程åº�(比如windows应用程åº�)ä¸çš„æ‰€æœ‰ç‰¹æ€§ã€‚ ç¡®ä¿�ä½ å·²ç»�å�‚阅了configparser文档ä¸çš„è¯æ³•详情以å�Šæ”¯æŒ�特性。