Python problème : NameError: name 's' is not defined

Résolu
Bonjour à tous,

Je m'interroge, je suis en train de programmer un script simple. Néanmoins, je souhaiterais que les utilisateurs n'utilisent que des caractères numériques et éventuellement des nombres décimaux mais en aucun cas des lettres et caractères spéciaux... Il y a bien des fonctions ou des boucles mais je souhaiterais que ce soit automatique pour toutes les étapes de mon programme. Actuellement, quand je rentre un lettre j'ai ce retour : NameError: name 's' is not defined. Or j'aimerais à la place redonner la possibilité à l'utilisateur de réinscrire une valeur numérique afin qu'il puisse continuer à utiliser le script...

---------------------------------------

Voici le début de script :
#coding:utf-8
print("Bonjour bienvenu dans le programme de gestion. Ce dernier est un appui à la gestion d'entreprise agricole")
print("Veuillez entrer des caractères numériques uniquement")
#bloquer les caractères spéciaux et les lettres
print ("Année de l'étude de l'analyse")
annee_d_etude = input (" ")


---------------------------------------------

Merci à vous pour vos retours, en espérant être clair.

Moi ;)

25 réponses

Résumé de la discussion

L'objectif est d'imposer une saisie numérique dans un script Python, afin d'éviter les erreurs lorsque des lettres sont entrées et d'offrir automatiquement une réinscription sans interrompre l'exécution. Des solutions alternent entre une boucle qui teste isdigit() et relance la saisie jusqu'à ce que le texte soit numérique, et l'adoption de fonctions comme input_int pour l'entier. Autre piste envisagée, plusieurs participants proposent d'encapsuler la validation dans des fonctions d'entrée float et int afin de gérer les nombres décimaux et d'utiliser des blocs try/except pour la robustesse. La solution la plus robuste repose sur des helpers d'entrée dédiés pour int et float, qui exigent une saisie valide via boucle et gestion d'exception, et qui s'appliquent même sans balises ni formatage.

Bobot (l’IA à votre service)
  1. Bon je pense avoir trouvé ce code fonctionne avec la version 2.7.18 de python :

    #coding:utf-8
    annee_d_etude =" "
    while(not annee_d_etude.isdigit()):
        annee_d_etude = raw_input ("Année de l'étude de l'analyse : ")
    1. Bon ça ne fonctionne toujours pas... Le problème ne viendrait pas du fait que j'ai un mac ?
      1. Aaaah super!

        Ben j'ai la même chose et en Python 3.7.2, ca marche ....
        1. #coding:utf-8
          annee_d_etude =''
          while(not annee_d_etude.isdigit()):
              annee_d_etude = input ("Année de l'étude de l'analyse : ")


          Voici le code écrit entre balises. Et merci...
          1. <code python><#coding:utf-8
            annee_d_etude =''
            while(not annee_d_etude.isdigit()):
            annee_d_etude = input ("Année de l'étude de l'analyse : ")>

            En espérant fait comme il le faut car je n'ai jamais mis de balises sur ce site pour mes questions...

            Merci
            1. pas de capture d'écran !

              fais un copié/collé de ton code et mets les balises comme je le fait !

              moi je suis en 3.7.2 et ça marche
              1. voici une capture d'écran...
                1. Modérateur
                  Tu es en quelle version de python ??? moi je suis en 3.9. Car un noyau linux 3.10 date de 7 ans.

                  avant input il y avait raw_input.
                2. @jee peeJ'ai essayé raw-input mais il détecte rien ... mais j'ai la version 3.10 de python ceci explique celà... Dois-je prendre la 3.9 ?
              2. c'est pas possible,

                comme je te disais, affiche ton code ici, et avec ls balises comme je le fais, qu'on voie

                les indentations
                1. C'est ce que je fais...

                  $ python essai.py
                  Année de l'étude de l'analyse : toto
                  Traceback (most recent call last):
                  File "essai.py", line 4, in <module>
                  annee_d_etude = input ("Année de l'étude de l'analyse : ")
                  File "<string>", line 1, in <module>
                  NameError: name 'toto' is not defined

                  Merci encore pour l'aide...

                  Moi :)
                  1. Fais juste un petit fichier test.py avec ces 3 lignes

                    déjà pour voir ce bout de code ...

                    ou alors refait voir ton code complet, celui que tu testes et qui sort cette erreur
                    1. Oui oui je fais un copier coller.... Je vais finir par trouver... mais pour le moment j'ai toujours des messages d'erreur... :(
                      1. Ouh la,

                        Tu dis que si tu fais un copié/collé de mes 3 lignes :

                        annee_d_etude =''
                        while(not annee_d_etude.isdigit()):
                            annee_d_etude = input ("Année de l'étude de l'analyse : ")


                        et que tu testes ça, ca plante ???

                        Moi ca donne ça:


                        Tu fais surement une erreur quelque part
                        1. Re,

                          quand je fais un copier coller du code et que je provoque l'erreur avec le console j'ai ce retour : .......$ python essai.py
                          Veuillez entrer des caractères numériques uniquement
                          Année de l'étude de l'analyse : d
                          Traceback (most recent call last):
                          File "essai.py", line 7, in <module>
                          annee_d_etude = input ("Année de l'étude de l'analyse : ")
                          File "<string>", line 1, in <module>
                          NameError: name 'd' is not defined

                          Je débute l'erreur doit être précisée sous les yeux mais je ne trouve pas... Désolé ...

                          Moi :)
                          1. Comment ça, tu cherches toujours ?

                            on t'a donné des solutions !

                            Tu ne vas pas me dire que ça:

                            annee_d_etude =''
                            while(not annee_d_etude.isdigit()):
                                annee_d_etude = input ("Année de l'étude de l'analyse : ")
                            


                            te sort une erreur si tu entres une lettre, ca te repose la question en fait, donc ca marche !
                            1. Bonjour à tous,

                              merci pour votre aide... En effet, je cherche à coder pour le moment quand je rentre une lettre ça me met un message d'erreur et ne me propose pas de réécrire... je chercher toujours en tout cas merci pour votre aide...

                              Moi2937
                              1. Bonjour,

                                Hé oui

                                De la façon dont moi2997 posait le problème, on avait l'impression qu'il attendait une

                                formule magique à écrire en début de code pour que toutes les saisies se fassent

                                automatiquement sur des nombres:

                                l y a bien des fonctions ou des boucles mais je souhaiterais que ce soit automatique pour toutes les étapes de mon programme

                                Automatique : automatiser, c'est coder, il faut que tu codes la mécanique toi-même

                                ce n'est pas de la magie :-)
                                1. Modérateur
                                  Salut,

                                  Dans ce cas tu crées tes propres fonctions de saisie int et float
                                  print("Bonjour bienvenu dans le programme de gestion. Ce dernier est un appui à la gestion d'entreprise agricole")
                                  print("Veuillez entrer des caractères numériques uniquement")
                                  #bloquer les caractères spéciaux et les lettres
                                  #suite correcte
                                  def input_int(lib):
                                      saisie=''
                                      while (not saisie.isdigit()):
                                         saisie = input (lib)
                                      return (int(saisie))
                                  def input_float(lib):
                                     while True:
                                        saisie = input (lib)
                                        try:
                                           float(saisie)
                                           return (float(saisie))
                                        except ValueError:
                                            pass
                                  annee_d_etude = input_int ("Année de l'étude de l'analyse ")
                                  ageagri = input_int ("Age de l'agriculteur ")
                                  annee_installation = input_int ("Année d'installation ")
                                  if annee_installation >0:
                                     print ("BILAN")
                                     print ("Bilan Financier")
                                     print ("Actif")
                                     immobilisations = input_float("Immobilisations ")
                                     stocks = input_float ("stocks ")
                                     creances = input_float ("Créances ")
                                     disponible = input_float ("Disponible ")
                                  
                                  print(annee_d_etude, ageagri, annee_installation,immobilisations,stocks,creances, disponible)
                                  
                                   


                                  1. Comme je disais je souhaiterais que l'utilisateur ne puisse pas écrire de caractères spéciaux ou encore de lettre mais uniquement des chiffres.
                                    Voici mon code :
                                    #coding:utf-8
                                    print("Bonjour bienvenu dans le programme de gestion. Ce dernier est un appui à la gestion d'entreprise agricole")
                                    print("Veuillez entrer des caractères numériques uniquement")
                                    #bloquer les caractères spéciaux et les lettres
                                    #suite correcte
                                    print ("Année de l'étude de l'analyse")
                                    annee_d_etude = input (" ")
                                    print ("Age de l'agriculteur")
                                    ageagri = input (" ")
                                    print ("Année d'installation")
                                    annee_installation = input (" ")
                                    while annee_installation >0:
                                            print ("BILAN")
                                            print ("Bilan Financier")
                                            print ("Actif")
                                            print ("Immobilisations")
                                            immobilisations = float (input(" "))
                                            print ("stocks")
                                            stocks = float (input (" "))
                                            print ("Créances")
                                            creances = float (input (" "))
                                            print ("Disponible")
                                            disponible = float (input (" "))


                                    Merci d'avance,

                                    Moi :)
                                    • 1
                                    • 2