#1 Le 22/07/2017, à 18:16
- Arbiel
Python : clause except non prise en compte
Bonsoir à tous
Je veux lire un fichier qui est supposé contenir un dictionnaire au sens python, mais peut ne pas encore exister, auquel cas, je veux le créer.
J'ai écrit
def le_score(fic_scores,joueur):
maj=False
with open(fic_scores,"rb") as les_scores:
try:
scores=pickle.Unpickler(les_scores)
except FileNotFoundError:
d_scores={}
maj=True
else:
d_scores=scores.load()
try:
score=d_scores[joueur]
except KeyError:
d_scores[joueur]=0
score=0
maj=True
if maj:
with open(fic_scores,"wb") as les_scores:
scores=pickle.Pickler(les_scores)
scores.dump(d_scores)
return score
def main():
scores="/home/remi/Bureau/scores.pendu"
le_score(scores,"Arbiel")
return 0
if __name__ == '__main__':
main()
Lorsque j'exécute ce code, Python semble ignorer ma tentative de capture de l'erreur, et m'indique
remi@remi-Vostro-3550:~$ python3 '/home/remi/Bureau/scores.py'
Traceback (most recent call last):
File "/home/remi/Bureau/scores.py", line 53, in <module>
main()
File "/home/remi/Bureau/scores.py", line 49, in main
le_score(scores,"Jean-Jacques")
File "/home/remi/Bureau/scores.py", line 27, in le_score
with open(fic_scores,"rb") as les_scores:
FileNotFoundError: [Errno 2] No such file or directory: '/home/remi/Bureau/scores.pendu'
remi@remi-Vostro-3550:~$
Merci à quiconque voudra bien m'indiquer l'origine de mon erreur.
Arbiel
Dernière modification par Arbiel (Le 22/07/2017, à 18:18)
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne
#2 Le 22/07/2017, à 18:29
- pingouinux
Re : Python : clause except non prise en compte
Bonjour,
Le try doit être placé avant le open.
Hors ligne
#3 Le 22/07/2017, à 20:54
- Arbiel
Re : Python : clause except non prise en compte
Merci.
J'arrive bien à écrire, mais pas à relire le fichier.
def le_score(fic_scores,joueur):
import pickle
maj=False
try:
with open(fic_scores,"rb") as les_scores: scores=pickle.Unpickler(les_scores)
except FileNotFoundError:
d_scores={}
maj=True
else:
d_scores=scores.load()
try:
score=d_scores[joueur]
except KeyError:
d_scores[joueur]=0
score=0
maj=True
if maj:
with open(fic_scores,"wb") as les_scores:
scores=pickle.Pickler(les_scores)
scores.dump(d_scores)
return score
def main():
import pickle
scores="/home/remi/Bureau/scores.pendu"
le_score(scores,"Arbiel")
return 0
if __name__ == '__main__':
main()
et à l'exécution
remi@remi-Vostro-3550:~$ python3 '/home/remi/Bureau/scores.py'
remi@remi-Vostro-3550:~$ python3 '/home/remi/Bureau/scores.py'
Traceback (most recent call last):
File "/home/remi/Bureau/scores.py", line 56, in <module>
main()
File "/home/remi/Bureau/scores.py", line 50, in main
le_score(scores,"Rémi")
File "/home/remi/Bureau/scores.py", line 34, in le_score
d_scores=scores.load()
ValueError: PyMemoryView_FromBuffer(): info->buf must not be NULL
remi@remi-Vostro-3550:~$
Les numéros de ligne ne sont pas bons car je n'ai pas publié les commentaires insérés automatiquement par geany au début du code.
Dernière modification par Arbiel (Le 22/07/2017, à 21:05)
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne
#4 Le 22/07/2017, à 22:56
- pingouinux
Re : Python : clause except non prise en compte
Je pense que lorsque tu es sorti du bloc with open(...) ..., tu ne peux plus lire le fichier.
Ajouté : Essaye
def le_score(fic_scores,joueur):
maj=False
try:
with open(fic_scores,"rb") as les_scores:
scores=pickle.Unpickler(les_scores)
d_scores=scores.load()
except FileNotFoundError:
d_scores={}
maj=True
try:
score=d_scores[joueur]
except KeyError:
d_scores[joueur]=0
score=0
maj=True
if maj:
with open(fic_scores,"wb") as les_scores:
scores=pickle.Pickler(les_scores)
scores.dump(d_scores)
return score
def main():
import pickle
global pickle
scores="/home/remi/Bureau/scores.pendu"
le_score(scores,"Arbiel")
return 0
if __name__ == '__main__':
main()
Dernière modification par pingouinux (Le 22/07/2017, à 22:59)
Hors ligne
#5 Le 22/07/2017, à 23:31
- Arbiel
Re : Python : clause except non prise en compte
Tu as tout à fait raison. Avec ton code
remi@remi-Vostro-3550:~$ rm '/home/remi/Bureau/scores.pendu'
remi@remi-Vostro-3550:~$ hexdump -C '/home/remi/Bureau/scores.pendu'
hexdump: /home/remi/Bureau/scores.pendu: Aucun fichier ou dossier de ce type
remi@remi-Vostro-3550:~$ python3 '/home/remi/Bureau/scores.py'
remi@remi-Vostro-3550:~$ hexdump -C '/home/remi/Bureau/scores.pendu'
00000000 80 03 7d 71 00 58 06 00 00 00 41 72 62 69 65 6c |..}q.X....Arbiel|
00000010 71 01 4b 00 73 2e |q.K.s.|
00000016
remi@remi-Vostro-3550:~$ python3 '/home/remi/Bureau/scores.py'
remi@remi-Vostro-3550:~$ python3 '/home/remi/Bureau/scores.py'
remi@remi-Vostro-3550:~$ hexdump -C '/home/remi/Bureau/scores.pendu'
00000000 80 03 7d 71 00 58 06 00 00 00 41 72 62 69 65 6c |..}q.X....Arbiel|
00000010 71 01 4b 00 73 2e |q.K.s.|
00000016
remi@remi-Vostro-3550:~$
Je m'appuie sur le cours "Apprenez à programmer en Python", mais l'apprentissage n'est pas de tout repos.
Merci encore pour ton aide.
Arbiel
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne