Accueil » Python » Forums Python » Forum général Python » Debutant : remplacer une chaine de caracteres

 • Debutant : remplacer une chaine de caracteres

Document Actions
Réponses: 10   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

 • Debutant : remplacer une chaine de caracteres

Posté par ph_biohazard le 01/11/2006 15:11
Bonjour a tous;

Je suis dans Python depuis 2 jours :)

Vous allez peut etre trouver cette question stupide, mais je ne m'en sorts pas.

Je voudrais rechercher la chaine 'smtpd' dans main.cf et le remplacer par une 'addr ip'

J'ai essaye ceci, sans succes, mais peut etre je parts sur une mauvaise piste.

ipIn = raw_input('Entrer ip forwarding ? ')
s = open('/etc/postfix/master.cf').read()
if 'smtpd' in s:
s.replace('smtpd' , ipIn)
f.write('/etc/postfix/master.cf')
else :
exit()

Je ne comprends pas s.replace met un expected charactere buffer object et que mon fichier ne se trouve pas modifier

Merci pour votre aide

Marc

 • Re: Debutant : remplacer une chaine de caracteres

Posté par fraoustin le 02/11/2006 09:52
je ferais:
code:
ipIn = raw_input('Entrer ip forwarding ? ')
s = open('/etc/postfix/master.cf','r')
o = open('/etc/postfix/master.cf.out','w')
for i in s.readlines():
    o.write('%s\n' % i.replace('smtpd' , ipIn))
s.close()
o.close()


par contre je n'ai pas testé

 • Re: Debutant : remplacer une chaine de caracteres

Posté par palm6174 le 02/11/2006 11:12
J'ai testé, ça marche :)

 • Re: Debutant : remplacer une chaine de caracteres

Posté par ph_biohazard le 02/11/2006 16:14
Bonjour

Super merci :)

Par rapport a cela, je dois egalement dans le fichier remplacer la chaine smtp ET smtpd

Si je modifie smtpd de ton script en smtp, cad :

# ipIn = raw_input('Entrer ip du serveur de mail distant ? ')
portIn = raw_input('Entrer le port du serveur de mail distant ? ')

s = open('c:/master.cf','r')
o = open('c:/master.cf.out','w')

for i in s.readlines():
# o.write('%s\n' % i.replace('smtpd' , ipIn))
o.write('%s\n' % i.replace('smtp' , portIn))
s.close()
o.close()

J'ai ce resultat :

# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================

25 inet n - y - - 25d

Deux commentaires par rapport a ce resultat :

a. Le script m'a remplace TOUS les mots contenant smtp mais il ne tient pas rigueur de voir la fin de la ligne ou il y a 25d car il a remplace smtpd en 25d

b. Comment renommer le .out en master.cf .
Si je mets dans le script :
s = open('c:/master.cf','rw')
ou
s = open('c:/master.cf','w')
en remplacant les appels au fichier destination par l'original, j'ai cette erreur :
for i in s.readlines():
IOError:Bad file descriptor

Merci encore pour ton aide

Marc

 • Re: Debutant : remplacer une chaine de caracteres

Posté par gawel le 03/11/2006 02:20
si tu commence par remplacer les smtpd puis les smtp, cela devrait aller, non ?

Pour ton problème de renomage, tu peux passer par une StringIO

code:
from cStringIO import StringIO

out = StringIO()
in = open('unfichier')

for line in in:
  print >> out, line.replace('untruc','parunautre').replace('unautretruc','parencoreunautre')

in.close()

out2 = open('unfichier','w')
out2.write(out.getvalue())
out2.close()

 • Re: Debutant : remplacer une chaine de caracteres

Posté par gawel le 03/11/2006 02:22
oups, 'in' est un mot réservé. choisis en un autre :)

 • Re: Debutant : remplacer une chaine de caracteres

Posté par ph_biohazard le 03/11/2006 11:53
WOW :))

Merci Gawel, c'est une bombe ton truc :)

Super merci
Marc

 • Re: Debutant : remplacer une chaine de caracteres

Posté par ph_biohazard le 03/11/2006 13:27
Re,

Comment ferais tu pour ajouter un # devant une ligne ?

exemple:
Voici la commande originale

mynetworks = 127.0.0.1

Voici ce que j'aimerai avoir :

#mynetworks = 127.0.0.1
mynetworks = 192.168.1.1

La ligne mynetworks = 192.168.1.1 est une valeur que je reecris avec ton astuce replace, mais je voudrais qd meme faire un backup des modifs

Si tu peux me mettre sur la piste, ce serait sympa ;)

Merci
Marc

 • Re: Debutant : remplacer une chaine de caracteres

Posté par palm6174 le 03/11/2006 15:22
une solution parmi plein d'autres

a = "mynetworks = 192.168.1.1"
b = "#" + a

 • Re: Debutant : remplacer une chaine de caracteres

Posté par palm6174 le 03/11/2006 15:23
oui enfin , c'est 127... que tu voulais commenter, mais tu vois l'idée

 • Re: Debutant : remplacer une chaine de caracteres

Posté par gawel le 04/11/2006 13:08
Tiens, je suis gentil, j'ai pensé à toi.

http://www.afpy.org/Members/gawel/python/utilisation_de_re_sub/

Dans le dernier exemple, tu peux renvoyer deux lignes au lieux d'une pour guarder l'originale commentée.

Après, les regexp, c'est pas forcément simple. J'espère que ca va pas t'embrouiller :)