Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Appel à contributeurs pour la doc.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 22/07/2017, à 19: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, à 19:18)


Arbiel Perlacremaz
Dell Vostro 3550 Ubuntu 14.04 64 bits (je ne suis pas passé à la 16,04 à cause d'un problème majeur avec crypttab, et de sa déconcertante lenteur)
Protonmail, une messagerie sécurisée

Hors ligne

#2 Le 22/07/2017, à 19: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, à 21: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, à 22:05)


Arbiel Perlacremaz
Dell Vostro 3550 Ubuntu 14.04 64 bits (je ne suis pas passé à la 16,04 à cause d'un problème majeur avec crypttab, et de sa déconcertante lenteur)
Protonmail, une messagerie sécurisée

Hors ligne

#4 Le 22/07/2017, à 23: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, à 23:59)

Hors ligne

#5 Le 23/07/2017, à 00: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
Dell Vostro 3550 Ubuntu 14.04 64 bits (je ne suis pas passé à la 16,04 à cause d'un problème majeur avec crypttab, et de sa déconcertante lenteur)
Protonmail, une messagerie sécurisée

Hors ligne