[Tutor] Looping + Variables

Martin Walsh mwalsh at groktech.org
Mon Oct 22 04:47:12 CEST 2007


James wrote:
> Hi.  :)
>
> I'm trying to write a loop to simplify my life (and code :)).  The
> loop is going to iterate over a list of values that I have to change
> in a file.  I think my problem is better described with some code.  :)

Use a dictionary instead of a tuple ...

# variables
editValues = {
    "interface": "eth0",
    "address": "192.168.1.5",
    "mask": "255.255.255.0",
    "gateway": "192.168.1.1"
}

> def replaceText( old , new , file ):
> 	for line in fileinput.FileInput( file , inplace = 1 ):
> 		line = line.replace( old , new )
> 		sys.stdout.write( line )
> 

for key in editValues.keys():
    replaceText('$' + key + '$' ,
        editValues[key] , '/etc/conf.d/net' )

> 
> config_$interface$=( "$address$ netmask $mask$" )
> routes_$interface$=( "default via $gateway$" )

Are you locked into this substitution format? If not, then how about
something like this:

# /etc/conf.d/net
config_%(interface)s=( "%(address)s netmask %(mask)s" )
routes_%(interface)s=( "default via %(gateway)s" )

You can then use python string formating (described here:
http://docs.python.org/lib/typesseq-strings.html), and pass the dict
directly. Note: if your file already contains '%' symbols that won't be
substituted, you must escape (prefix) them with an additional '%'.

valuedict = {
    "interface": "eth0",
    "address": "192.168.1.5",
    "mask": "255.255.255.0",
    "gateway": "192.168.1.1"
}

template = """\
# /etc/conf.d/net
config_%(interface)s=( "%(address)s netmask %(mask)s" )
routes_%(interface)s=( "default via %(gateway)s" )
"""

print template % valuedict

... prints ...

# /etc/conf.d/net
config_eth0=( "192.168.1.5 netmask 255.255.255.0" )
routes_eth0=( "default via 192.168.1.1" )

HTH,
Marty


More information about the Tutor mailing list