input2()
On doit parfois réduire le choix de l'utilisateur aux seuls caractères autorisés. En effet, par exemple, tous les caractères ne sont pas autorisés dans le nom d'un fichier. La fonction suivante, non native, input2() limite le choix de l'utilisateur.
ALPHA="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" DIGIT="0123456789" FILENAME=ALPHA+DIGIT+"-_" # nom de fichier sans extension CARAC_66=FILENAME+".~"# 66 caractères sont autorisés dans un nom de fichier # (Son nom n'est alors pas modifié dans son URL s'il est sur un serveur) WORD_FR=ALPHA+" 'éèêëàâîïôùûüÿæœçÀÂÇÉÈÊËÎÏÔÙÛÜŸÆŒ" # pour NOM, prénom, mot ALL_CARAC=WORD_FR+"<>/\()[]{}|`£¤%§?;,@&=+$#:!¤°^.~" # (") est exclu dans ce programme def input2(msg, str_carac=FILENAME, isCaracOK=True, isVideOK=False): """ Cette fonction retourne une string composée de caractères autorisés. NB : input2() est une version "améliorée" de la fonction native input() :param str msg: message affiché avant le curseur :param str str_carac: liste des caractères. Par défaut, vaut FILENAME :param bool isCaracOK: True (par défaut) Si True, second argument = la liste des caractères autorisés Si False, second argument = liste des caractères interdits NB : Le contrôle est sûr en n'autorisant que des caractères autorisés, mais plus lent si quasi tous les caractères sont autorisés :param bool isVideOK: False (par défaut) Si True, la valeur de retour peut être vide Si False, la valeur de retour ne peut pas être vide :return: Une string tapée (ou collée) par l'utilisateur :rtype: str """ while(True): re=input(msg); OK=True for i in range(len(re)): if(isCaracOK): if (re[i] not in str_carac): print(re[i]+" est un caractère interdit."); OK=False; break else: if (re[i] in str_carac): print(re[i]+" est un caractère interdit."); OK=False; break if(not OK): continue if(not isVideOK and len(re)==0): continue return re re=input2("Nom du fichier (sans extension): ") print("Votre réponse = "+re) re=input2("Année de votre naissance : ", DIGIT) print("Votre réponse = "+re) re=input2("Votre nom : ", ".~<>/\()[]{}|`£¤%§?0123456789;,@&=+$#_", False) print("Votre réponse = "+re)
Lorsque quasi tous les caractères sont autorisés, le programme est plus rapide si on définit ceux qui ne sont pas. Toutefois, il est plus sûr de donner la liste (même longue) des caractères autorisés, pour éviter que des caractères exotiques (tel que : ♫ א 异) puissent être pris en compte par le programme. Ces caractères exotiques n'existent pas sur un clavier belge (ou français), mais ils peuvent être copiés/collés ...
Il est préférable de demander le nom d'un fichier sans son extension, car sinon, il faudra autoriser l'utilisateur à taper un point(.). S'il reçoit une telle autorisation, il pourra alors en taper un ou deux points sans taper l'extension. Or, certains noms de fichiers ont une signification particulière. Les fichiers "." et ".." ont une signification particulière sur les systèmes d'exploitation.
Obtenir une date valide au format AAAA-MM-JJ
import datetime def isDateValid(date_string): # retourne True si la date est valide date_format = '%Y-%m-%d' # accepte 2000-2-2 ! => les 4 lignes suivantes if (len(date_string)!=10): return False if (not date_string[:4].isdecimal() ): return False if (not date_string[5:7].isdecimal() ): return False if (not date_string[8:].isdecimal() ): return False try: date_obj = datetime.datetime.strptime(date_string, date_format) return True except: return False def getAAAAMMJJ(msg): # retourne une date valide au format AAAA-MM-JJ while (True): re=input(msg) if(isDateValid(re)):break return re x=getAAAAMMJJ("Introduisez une date au format AAAA-MM-JJ : ") print("Vous avez fourni la date valide : "+x)
Obtenir un nombre entier positif (0 admis)
def getIntPositif(msg): # 0 est autorisé while(True): n=input(msg) if (n.isdecimal()): break return int(n)
Choix dangereux => imposer la majuscule
=> Le choix par défaut est la lettre en minuscule.
def ma_fonction(): # début de la fonction re=input("Souhaitez-vous supprimer vos données ? Y/n : ") # Pour que les données ne soient pas supprimées accidentellement, # il faut que l'utilisateur marque son choix en appuyant sur 2 touches (MAJ + y) if(re!="Y"): print("Vos données ont été conservées.") else: # (code lié à la suppression des données) print("Données supprimées. C'était votre choix !") # Fin de la fonction # On peut coder plus court avec l'ajout du mot-cle 'return' : # début de la fonction re=input("Souhaitez-vous supprimer vos données ? Y/n : ") if(re!="Y"): print("Vos données ont été conservées."); return # (code lié à la suppression des données) print("Données supprimées. C'était votre choix !") # Fin de la fonction # Et, encore plus court ... si on ne prévient l'utilisateur qu'en cas de changement re=input("Souhaitez-vous supprimer vos données ? Y/n : ") if(re!="Y"): return # ... print("Données supprimées. C'était votre choix !") re=input("Souhaitez-vous devenir riche ? y/N : ") if(re!="N"): return print("Ce choix n'est pas normal.")
Effacer l'écran d'un terminal
import platform def effacEcran(): #------------------------------------------------------------- """ Cette procédure (sub) efface l'écran (du terminal). Elle requiert "import platform". NB : L'effacement de l'écran n'a pas lieu lorsque le programme est lancé via l'éditeur IDLE. Ni sous Mac. """ if platform.system() == "Windows": os.system("cls") elif platform.system() == "Linux": os.system("clear")
Sous Mac = ?