IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

invalid syntax sur close()


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut invalid syntax sur close()
    Bonsoir,

    J'ai fais un petit programme qui me permet de changer le mot de passe d'un utilisateur dans un fichier .csv. Mais lorsque j'essai de le tester il me met:

    File "./change.cgi", line 22
    fichier.close()
    ^
    SyntaxError: invalid syntax
    Pourtant il me semble que je l'utilise correctement, voici le code en question:

    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
    #!/usr/bin/env python
     
    import cgi
    import csv
    import string
     
    print "content-type: text/html\n"
    #form = cgi.FieldStorage()
     
    mdp = "tutu5"
    newmdp = "oui"
    test = 0
    l = csv.reader(open("donnees.csv", "r"), delimiter=":")
    for row in l:
    	if row[1] == mdp:
    		test = 1
    		break
    if test == 1:
    	fichier = open("donnees.csv", "w")
    	for i in fichier.readlines():
    		fichier.write('%s\n' % i.replace(mdp,newmdp)
    	fichier.close()
    else:
    	print "Aucun mot de passe n'a ete trouve"
    Merci de l'aide que vous pourrez m'apporter

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    manque une parenthèse fermante:
    fichier.write('%s\n' % i.replace(mdp,newmdp))

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Il faut fermer le fichier "donnees.csv" qui a été ouvert en mode 'r' avant de chercher à l'ouvrir en mode 'w'.
    Les modes 'r' et 'w' sont exclusifs.


    Pour pouvoir écrire et lire sans avoir à fermer un fichier entre les deux types d'opération, il faut ouvrir le fichier en mode r+ ou a+, ces modes sont dits modes d'update. Il y a aussi un mode w+.
    Mais attention, ces trois modes+ ont des subtilités que je n'ai pas encore réussi à comprendre tout à fait.
    Ce que j'ai compris, c'est qu'à l'ouverture du fichier en mode+, il y a un pointeur qui est positionné à un endroit précis du fichier:
    au début pour r+
    à la fin pour a+

    Ensuite ce qui se passe est assez mystérieux.
    Immédiatement après l'ouverture du fichier en mode r+ , on peut lire. Puis si on décide d'écrire, on le peut, et je crois que ça écrit à partir de la position atteinte par le pointeur dans le fichier du fait de la lecture. Mais d'après ce que j'ai testé, une fois qu'on a écrit quelque chose, on ne peut pas revenir en mode écriture, sauf à faire je ne sais quoi auparavant... Je crois aussi que quand ça écrit, ça efface les données en avant du pointeur. r+ est donc plutôt un mode correcteur.

    Quand au mode a+, il positionne le pointeur à la fin du fichier et on peut donc écrire en AJOUTANT des données à la SUITE du fichier. Mais je ne comprends pas dans quelle circonstance on peut lire si à l'ouverture le pointeur est mis sur fin.

    Quant au mode w+, il est tordu. Il ouvre le fichier en effaçant toutes les données déjà présentes et se positionne à la fin du fichier qui est en l'occurence son début, ou le contraire.
    ATTENTION donc au mode W+: RISQUE DE PERTE DE DONNÉES.
    Perso j'évite w+, je me débrouille avec w.

    Cette histoire de pointeur au début ou à la fin d'un fichier est une notion qui n'est pas anodine, mais je n'ai pas réussi à en comprendre toutes les subtilités latentes.


    EDIT
    Après correction de cette erreur qui est la pemière dans le code, tu verras signalée celle qu'indique guigui

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Il faut fermer le fichier "donnees.csv" qui a été ouvert en mode 'r' avant de chercher à l'ouvrir en mode 'w'.
    Les modes 'r' et 'w' sont exclusifs.
    Vu comme il l'utilise, c'est a priori bon, puisqu'il ne garde pas de référence sur le fichier. Toutefois il vaudrait mieux garder une référence et fermer explicitement (ou utiliser un with si python 2.6)
    Citation Envoyé par eyquem Voir le message
    Après correction de cette erreur qui est la pemière dans le code, tu verras signalée celle qu'indique guigui
    Avant correction plutôt, le traceback correspond à la parenthèse, Python vérifie la syntaxe avant d'exécuter.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Alors j'ai tenu compte de vos remarque et donc corrigé en fonction, malheureusement j'ai une nouvelle erreur :

    content-type: text/html

    Traceback (most recent call last):
    File "./modif.cgi", line 16, in <module>
    if row[1] == mdp:
    IndexError: list index out of range
    Et voici le code modifié:

    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
     
    print "content-type: text/html\n"
    #form = cgi.FieldStorage()
     
    mdp = "tutu5"
    newmdp = "oui"
    test = 0
    fichier = open("donnees.csv", "r")
    l = csv.reader(fichier, delimiter=":")
    for row in l:
    	if row[1] == mdp:
    		test = 1
    		break
    if test == 1:
    	fichier.close()
    	fichier = open("donnees.csv", "w")
    	for i in fichier.readlines():
    		fichier.write('%s\n' % i.replace(mdp,newmdp))
    	fichier.close()
    else:
    	print "Aucun mot de passe n'a ete trouve"

  6. #6
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Oui j'avais compris que j'esseyai d'accéder à un index de la liste qui n'existe pas mais je ne comprend pas pourquoi parce que quand j'affiche row[1] il m'affiche bien ce qu'il faut et que je laisse le test et bien ça me met l'erreur.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Bon c'est bon problème résolu maintenant encore un autre pour ne pas changer il me met cette erreur maintenant:

    content-type: text/html

    Traceback (most recent call last):
    File "./change.cgi", line 23, in <module>
    for i in fichier.readlines():
    IOError: [Errno 9] Bad file descriptor
    Et me supprime tout ce qu'il y a dans mon fichier csv.

  9. #9
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut J'ai répondu trop vite.
    Ayant eu des problèmes d'ouverture-fermeture de fichiers, je mets maintenant toujours les close() nécessaires, et j'ai rarement besoin d'ouvrir en w un fichier précédemment ouvert en r. Je croyais donc que chercher à ouvrir à nouveau en changeant de mode sans close() préalable provoquait une erreur. J'aurais dû vérifier. C'est ce que j'ai fait sur un exemple, et effectivement il n'y a pas d'erreur.

    Mais pourquoi le message d'erreur indique line 22 c'est à dire la ligne fichier.close() ?????

  10. #10
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut "c'est bon problème résolu maintenant "
    Mais quelle était la raison du problème ? On aimerait savoir

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Alors déjà ce que je cherche à faire: un utilisateur ce connecte sur ça page perso et voudrais pouvoir changer son mot de passe, il rentre son mot de passe actuel ainsi que son nouveau et le nouveau doit donc remplacer l'ancien. Donc j'ouvre le fichier .csv qui contient toutes les infos de l'utilisateurs, je regarde si le mot de passe rentré était celui qu'avais rentré l'utilisateur lors de son inscription et si oui je remplace celui-ci par le nouveau qu'il a rentré.

    Et le pourquoi qu'il m'indique la ligne j'en sais rien (je débute en python )

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Mais pourquoi le message d'erreur indique line 22 c'est à dire la ligne fichier.close() ?????
    Python sait gérer les sauts de ligne dans les parenthèses, ce qu'il ne sait pas gérer, c'est la succession de deux expressions sans autre délimiteur qu'un espace, en clair il ne s'attend pas à avoir l'identificateur "fichier", mais soit une suite à l'expression, soit une virgule, soit une parenthèse fermante.

    Ta nouvelle erreur, c'est parce que tu essaies de lire un fichier ouvert en écriture (et donc vide)

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Comment pourrais-je faire alors pour ce que je souhaite ?

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Le mieux je pense est de lire à partir d'une copie (si tu veux que le fichier de sortie soit le même), ou bien d'écrire dans un autre fichier, ou bien de garder tout le fichier en RAM s'il n'est pas trop gros.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Il faut que je l'ouvre deux fois en lecture alors ?

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Bon j'ai trouvé un moyen qui marche déjà mieux et sans erreur seulement au lieu de me modifier la ligne que je veux il me créé une nouvelle ligne en laissant celle que je veux remplacer.

    Voici le code:

    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
    #!/usr/bin/env python
     
    import cgi
    import csv
    import string
     
    print "content-type: text/html\n"
    #form = cgi.FieldStorage()
     
    mdp = "tutu5"
    newmdp = "oui"
    test = 0
    fichier = open("donnees.csv", "r+")
     
    for i in fichier.readlines():
        if mdp in i:
          test = 1
          fichier.write('%s' % i.replace(mdp,newmdp))
          fichier.close()
          break
     
    if test == 1:
    	print "changement effectue"
    else:
    	print "Aucun mot de passe n'a ete trouve"

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Non, tu as le choix entre plusieurs procédés:
    1) Tu fais une copie du fichier, tu lis dans la copie et tu écris dans l'original
    2) Tu lis dans le fichier et tu écris dans un fichier temporaire, que tu déplaces ensuite si nécessaire
    3) Si le fichier n'est pas trop gros, tu utilises une des méthodes précédentes en gardant le contenu temporaire (la copie dans le premier cas, le fichier temporaire dans le deuxième) en RAM

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Heuu j'ai rien compris pourquoi faire une copie d'un même fichier ? lors de l'inscription je vais pas enregistrer les informations dans deux fichiers différents ça rime à rien un seul suffit non ? Mais ce que 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

  19. #19
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut " j'ai du mal à croire "
    et donc ?
    quelle conclusion en tires tu ?
    il faut absolument que ce soit les autres qui te trouvent ce dont tu penses que ça doit bien exister ?
    tu ne te dis pas que si on ne peut douter que la possibilité existe, alors tu devrais être capable de trouver l'information par toi même ?

    Peut être ne sais tu où il faut regarder. Alors voici une page à lire absolument dès le début de l'apprentissage de Python:
    http://www.python.org/doc/2.5.2/lib/...s.html#l2h-306

    Il y a deux fonctions qui te permettront de faire ce que tu veux, mais je te laisse chercher.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Désolé mais le lien que tu m'as donné ne m'a pas servi à grand chose j'ai donc décidé de choisir un dérivé de la première solution qui m'est été proposer. C'est à dire créer un fichier pour recevoir les nouvelles donné et supprimer l'ancien puis le renommer. Voici ce que ça donne:

    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
    27
    28
    29
    30
    31
    #!/usr/bin/env python
     
    import cgi
    import os
    import csv
    import string
     
    print "content-type: text/html\n"
    #form = cgi.FieldStorage()
     
    mdp = "oui"
    newmdp = "tutu5"
    test = 0
    nouveau = open("donnees2.csv","w")
    fichier = open("donnees.csv", "r")
    lire = fichier.readlines()
     
    for ligne in lire:
        if mdp in ligne:
          test = 1
          ligne = ligne.replace(mdp,newmdp)
          nouveau.write(ligne)
        else:
          nouveau.write(ligne)
     
    os.remove("donnees.csv")
    os.rename("donnees2.csv","donnees.csv")
    if test == 1:
    	print "changement effectue"
    else:
    	print "Aucun mot de passe n'a ete trouve"
    Bon ce n'est pas vraiment ce que j'avais en tête au départ mais ça marche

Discussions similaires

  1. [MySQL] Erreur de syntaxe sur requête
    Par winnie82 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 21/03/2006, 13h51
  2. [MySQL] Erreur de syntaxe sur ma requête SELECT
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 08/03/2006, 11h50
  3. [MySQL] Erreurs de syntaxe sur requêtes DELETE
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/03/2006, 15h53
  4. Erreur de syntax sur JOIN
    Par helje dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/03/2006, 17h36
  5. Erreur de syntaxe sur la création d'une vue.
    Par cgougeon dans le forum Installation
    Réponses: 3
    Dernier message: 09/09/2005, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo