Contenu | Rechercher | Menus

Annonce

L'équipe des administrateurs et modérateurs du forum vous invite à prendre connaissance des nouvelles règles.
En cas de besoin, vous pouvez intervenir dans cette discussion.

Ubuntu 18.04 LTS
Ubuntu-fr propose des clés USB de Ubuntu et toutes ses « saveurs » ainsi qu'un magnifique t-shirt pour cette toute nouvelle version d'Ubuntu !

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.

À propos de l'équipe du forum.

#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 Ubuntu 14.04 64 bits (je ne suis pas passé à la 16.04  ; problème avec crypttab, et performance)
J'ai abandonné azerty au profit de bépo, google au profit de Lilo et mes adresses électroniques au profit d'une messagerie réellement sécurisée, Protonmail.

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.

En 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 Ubuntu 14.04 64 bits (je ne suis pas passé à la 16.04  ; problème avec crypttab, et performance)
J'ai abandonné azerty au profit de bépo, google au profit de Lilo et mes adresses électroniques au profit d'une messagerie réellement sécurisée, Protonmail.

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)

En 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 Ubuntu 14.04 64 bits (je ne suis pas passé à la 16.04  ; problème avec crypttab, et performance)
J'ai abandonné azerty au profit de bépo, google au profit de Lilo et mes adresses électroniques au profit d'une messagerie réellement sécurisée, Protonmail.

Hors ligne