Mes excuses pour mon post qui a dû te paraître un peu acide. En fait, je n'ai pas voulu critiquer ta façon de demander une solution un peu comme une exigence. Un forum est bien fait pour cela: poser des questions, pousser les autres dans leurs retranchements et se remettre soi même en question. C'est plutôt parce que j'ai vu dans ta réponse un brin de démission: tu dis que tu penses qu'il doit bien être possible de faire quelque chose dans un programme mais tu ne donnes pas l'impression de te dire que tu vas chercher et trouver par toi même.

Il se trouve que ma réaction est d'autant moins justifiée que ce n'est certainement pas sur le problème que tu soulèves qu'on peut l'avoir, car il était fort peu aisé pour le coup de trouver les éléments pour le résoudre, même en cherchant par soi même.
En fait, je pensais comme toi «j'ai du mal à croire qu'on ne peut pas remplacer une chaîne de caractère par une autre dans un seul fichier en python sans crééer une copie du fichier ».
Mais je pensais qu'avec le mode 'r+' et les deux fonctions de fichier tell() et seek() tu arriverais à te débrouiller.

Tu n'as pas détecté l'intérêt de ces deux fonctions dans le lien que je t'ai donné, mais elles n'auraient pas suffi en réalité. Car il fallait aussi mettre au clair le fonctionnement de la lecture et de l'écriture dans un fichier en mode 'r+', et ça , ce n'a pas été simple. Ça faisait plusieurs mois que je n'y comprenais rien, ou pas suffisamment clairement. Et quand j'ai essayé d'écrire le code pour répondre à ton problème, je me suis aperçu que je te donnais des indications mais que je n'étais pas foutu de les metter en œuvre moi même.
J'ai donc fait ce que je t'avais reproché de ne pas faire, j'ai cherché et ça donne le sujet que j'ai mis par ailleurs sur le forum.

Trève de bavardage, voici le code que je peux maintenant te proposer pour répondre à (presque) ton problème

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
 
import cgi
import csv
import string
from os import fsync
 
print "content-type: text/html\n"
#form = cgi.FieldStorage()
 
mdp, newmdp = "ouioui", "tutu55"
 
fichier = open("donnees.csv", "r+")
 
while 1:
    p,ligne = fichier.tell(),fichier.readline()
    if not ligne:
        print "Aucun mot de passe n'a ete trouve"
        break
    if mdp in ligne:
        fichier.seek( p + ligne.find(mdp) )
        write(newmdp)
        fichier.flush()
        fsync(fichier.fileno())
        print "changement effectue"
        break
Je n'ai pas testé. A priori ça devrait marcher.

Tu remarqueras que j'ai changé mdp et newmdp pour leur donner la même longueur.
L'écriture en mode 'r+' se fait en effet par écrasement des données préexistantes à partir du point de départ: si on écrit 12 caractères pour en ramplacer 5, on va déborder sur les 7 caractères au delà des 5 caractères visés.
Cette caractéristique rend impropre l'utilisation du mode 'r+' pour modifier un fichier dans certains cas. Pour que ce soit possible, il faut que le fichier ait été construit pour permettre une éventuelle modification de caractères au sein de cartouches déterminés (je prends ici un cartouche = suite de caractères en nombre fixé).
Le cas des mots de passe est sans doute typique: on peut imposer qu'ils ne dépassent pas une certaine longueur. Ceci implique des conséquences tant au niveau de l'écriture (il faut compléter par des blancs jusqu'à la fin du cartouche) qu'au niveau de l'entrée des mots de passe. C'est du code facile à faire