2016-04-04 13 views
0

ProblemPython: Dateierweiterung prüfen und fordert erneut Eingabe, wenn ungültige Dateierweiterung

eine while-Schleife Doing Dateierweiterung zu bestätigen. Wenn eine Dateierweiterung nicht .exe oder .bat ist, fragen Sie die Benutzereingabe erneut. Ich suche nach einer Lösung ohne importendswithbreak Funktionen zu verwenden.

Code

format = " " 
while file[:-4] != ".bat" and file[:-4] != ".exe": 
    format = input("Enter file you like to open: ") 
    if format[:-4] == ".bat" or format[:-4] == ".exe": 
     callFunction(format) 
    else: 
     file = input("Enter file you like to open: ") 

Antwort

1

Sie brauchen nicht eine Schleife

def ask_exe(prompt='Executable file name? '): 
    name = input(prompt) 
    if name[-4:] in {'.exe', '.bat'}: return name 
    return ask_exe(prompt='The name has to end in ".exe" or ".bat", please retry: ') 

[keine Brüche, keine Importe, fast kein Code ...] Als

von ShadowRanger meinen Code festgestellt, dass set Notation für die Mitgliedschaft Test verwendet werden, suboptimal für Python-Versionen vor 3.2. Bei diesen älteren Versionen vermeidet die Verwendung einer tuple Berechnung das Set zur Laufzeit jedes Mal, wenn die Funktion ausgeführt wird.

... 
    # for python < 3.2 
    if name[-4:] in ('.exe', '.bat'): return name 
... 
+0

@ShadowRanger Ihre Bearbeitung war eine Quelle der Inspiration.tx – gboffi

+0

Nur ein Kopf hoch, der Satz literal Ansatz wird mehr kosten auf älteren Python; 'Tuple's von Literalen werden in allen Versionen von Python im Konstantenspeicher pro Funktion zwischengespeichert, aber [Membership-Tests für Set-Literale werden nur in' Frozenset's konvertiert und im Konstantenspeicher auf Python 3.2 + gespeichert.] (https://docs.python.org/3/whatsnew/3.2.html#optimizations); Bei 3.1 und früher (einschließlich aller 2.x-Versionen) muss das 'set' jedes Mal erstellt werden, dann wird ein Mitgliedschaftstest durchgeführt; Die Nachschlagetabelle einzusparen, indem das 'set' jedes Mal neu erstellt wird, ist ein Nettoverlust. Für zwei Elemente ist das 'Tupel' sogar in 3.2+ in Ordnung. – ShadowRanger

+0

@ShadowRanger Vielen Dank für das Interesse, die Diskussion und den Link. Jetzt ist der Grund Ihrer Bearbeitung wirklich klar. Ich habe meine Antwort entsprechend bearbeitet (nun, ich hoffe es ...) – gboffi

3

Asking the user for input until they give a valid response zu folgen und mit os.path.splitext() die Dateierweiterung zu extrahieren:

import os 

ALLOWED_EXTENSTIONS = {".bat", ".exe"} 
while True: 
    filename = input("Enter file you like to open: ") 
    extension = os.path.splitext(filename)[1] 
    if extension in ALLOWED_EXTENSTIONS: 
     break 

with open(filename) as f: 
    # do smth with f 

Ohne break:

import os 

ALLOWED_EXTENSTIONS = {".bat", ".exe"} 
extension = None 
while extension not in ALLOWED_EXTENSTIONS: 
    filename = input("Enter file you like to open: ") 
    extension = os.path.splitext(filename)[1] 

with open(filename) as f: 
    # do smth with f 

Ohne break und ohne Importe:

ALLOWED_EXTENSTIONS = (".bat", ".exe") 
filename = "" 
while not filename.endswith(ALLOWED_EXTENSTIONS): 
    filename = input("Enter file you like to open: ") 

with open(filename) as f: 
    # do smth with f 

Ohne break und ohne Importe und ohne endswith():

ALLOWED_EXTENSTIONS = {"bat", "exe"} 
filename = "" 
while filename.rsplit(".",1)[-1] not in ALLOWED_EXTENSTIONS: 
    filename = input("Enter file you like to open: ") 

with open(filename) as f: 
    # do smth with f 
+0

danke für die antwort, aber ich war auf der suche nach einer lösung ohne endswith und brechen. – LearnAndLearn

+0

@LearnAndLearn sicher, 'endswith()' wurde extra, behoben. – alecxe

+0

gibt es eine andere Möglichkeit, die Schleife zu stoppen, ohne Pause und importieren – LearnAndLearn