Property Files and Configuration (or.INI
)
Files: The ConfigParser
Module
A property file, also known as a configuration (or
.INI
) file defines property or configuration
values. It is usually just a collection of settings. The essential
property-file format has a simple row-oriented format with only two
values in each row. A configuration (or .INI
) file
organizes a simple list of properties into one or more named
sections.
A property file uses a few punctuation rules to encode the
data.
-
Lines begining with #
or ;
are
ignored. In some dialects the comments are #
and
!
.
-
Each property setting is delimited by an ordinary newline
character. This is usually the standard \n
. If you are
exchanging files across platforms, you may need to open files for
reading using the "rU" mode to get universal newline
handling.
-
Each property is a simple name and a value. The name is a
string characters that does not use a separator character of
:
or =
. The value is everything after the
punctuation mark, with leading and trailing spaces removed. In some
dialects space is also a separator character.
Some property file dialects allow a value to continue on to the
next line. In this case, a line that ends with \
(the
cwo-character sequence \
\n
) escapes the usual
meaning of \n
. Rather being the end of a line,
\\n
is just another whitespace character.
A property file is an extension to the basic tab-delimited file.
It has just two columns per line, and some space-stripping is done.
However, it doesn't have a consistent separator, so it is slightly more
complex to parse.
The extra feature introduced in a configuration file is named
sections.
Reading a Simple Property File. Here's an example of reading the simplest kind of property file.
In this case, we'll turn the entire file into a dictionary. Python
doesn't provide a module for doing this. The processing is a sequence
string manipulations to parse the file.
propFile= file( r"C:\Java\jdk1.5.0_06\jre\lib\logging.properties", "rU" )
propDict= dict()
for propLine in propFile:
propDef= propLine.strip()
if len(propDef) == 0:
continue
if propDef[0] in ( '!', '#' ):
continue
punctuation= [ propDef.find(c) for c in ':= ' ] + [ len(propDef) ]
found= min( [ pos for pos in punctuation if pos != -1 ] )
name= propDef[:found].rstrip()
value= propDef[found:].lstrip(":= ").rstrip()
propDict[name]= value
propFile.close()
print propDict
print propDict['handlers']
The input line is subject to a number of processing steps.
-
First the leading and trailing whitespace is removed. If the
line is empty, nothing more needs to be done.
-
If the line begins with !
or #
(;
in some dialects) it is ignored.
-
We find the location of all relevant puncuation marks. In some
dialects, space is not permitted. Note that we through the length of
the line on the end to permit a single word to be a valid property
name, with an implicit value of a zero-length string.
-
By discarding punction positions of -1, we are only processing
the positions of punctuation marks which actually occur in the
string. The smallest of these positions is the left-most punctuation
mark.
-
The name is everything before the punctuation mark with
whitespace remove.
-
The value is everything after the punctuaion mark. Any
additional separators are removed, and any trailing whitespace is
also removed.
Reading a Config File. The ConfigParser
module has a number of
classes for processing configuration files. You initialize a
ConfigParse object with default values. The object can the read one or
more a configuration files. You can then use methods to determine what
sections were present and what options were defined in a given
section.
import ConfigParser
cp= ConfigParser.RawConfigParser( )
cp.read( r"C:\Program Files\Mozilla Firefox\updater.ini" )
print cp.sections()
print cp.options('Strings')
print cp.get('Strings','info')
Eschewing Obfuscation. While a property file is rather simple, it is possible to
simplify property files further. The essential property definition
syntax is so close to Python's own syntax that some applications use a
simple file of Python variable settings. In this case, the settings
file would look like this.
Example 34.3. settings.py
# Some Properties
TITLE = "The Title String"
INFO = """The information string.
Which uses Python's ordinary techniques
for long lines."""
This file can be introduced in your program with one statement:
import settings
. This statement will create module-level
variables, settings.TITLE
and
settings.INFO
.