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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    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 confirmé
    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 : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

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

  3. #3
    Membre Expert
    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
    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 émérite

    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
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    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 confirmé
    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 : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    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 Expert
    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
    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() ?????

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