What do you guys think about this - file writing

Gerhard Häring gerhard.haering at gmx.de
Fri Aug 30 22:05:32 EDT 2002

Micah Mayo wrote in comp.lang.python:
> I'm trying to write a script that looks for a string in a textfile and
> replaces it with a given string. This is what I've come up with:


#!/usr/bin/env python
import re

SENDMAIL_RE = re.compile("^\w*sendmail_enable\w*=\w*.*$", re.M)

f = open("/etc/rc.conf")
t = f.read()

t =  SENDMAIL_RE.sub('sendmail_enable="NO" # Sendmail sucks - use Postfix', t)
f = open("/etc/rc.conf", "w")

> #!/usr/local/bin/python
> import os
> orig = 'sendmail_enable="YES"'
> pref = 'sendmail_enable="NONE"\n'
> tmp = file('rc.conf.tmp','w')
> for eachLine in open('rc.conf'):
>      print orig,'\n',eachLine
>      if eachLine.find(orig) !=-1:
>          print '..replacing', orig, 'with',pref
>          tmp.writelines(pref)
>          # will add code to replace eachLine w/ pref later
>      else:
>          print 'skipping'
>          tmp.write(eachLine)
> tmp.close()
> os.rename('rc.conf.tmp','rc.conf')
> This works - but I was hopeing there was a more elegant way to do this. 
> If anyone can think of a more efficient way to do this(not having to 
> open two files would be nice), I'd appreciate the input.

OTOH, your way of using a temp file looks reasonably safe, as the rename is
an atomic filesystem operation. Mine just assumes that the program doesn't
crash during open() and close() for some weird reason.

mail:   gerhard <at> bigfoot <dot> de       registered Linux user #64239
web:    http://www.cs.fhm.edu/~ifw00065/    OpenPGP public key id AD24C930
public key fingerprint: 3FCC 8700 3012 0A9E B0C9  3667 814B 9CAA AD24 C930
reduce(lambda x,y:x+y,map(lambda x:chr(ord(x)^42),tuple('zS^BED\nX_FOY\x0b')))

More information about the Python-list mailing list