python:检查文件扩展名,如果文件扩展名无效,则再次提示输入

python:检查文件扩展名,如果文件扩展名无效,则再次提示输入,python,validation,python-3.x,input,Python,Validation,Python 3.x,Input,问题 执行while循环以验证文件扩展名。如果文件扩展名不是.exe或.bat,请再次询问用户输入。我正在寻找一种不使用importendswithbreak函数的解决方案 代码 format = " " while file[:-4] != ".bat" and file[:-4] != ".exe": format = input("Enter file you like to open: ") if format[:-4] == ".bat" or format[:-4]

问题

执行while循环以验证文件扩展名。如果文件扩展名不是.exe或.bat,请再次询问用户输入。我正在寻找一种不使用
import
endswith
break
函数的解决方案

代码

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: ")
要遵循并使用以提取文件扩展名,请执行以下操作:

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

不带
中断

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

不带
中断
且不带任何导入:

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

不带
break
和任何导入,不带
endswith()

要遵循并使用以提取文件扩展名,请执行以下操作:

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

不带
中断

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

不带
中断
且不带任何导入:

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

不带
break
和任何导入,不带
endswith()

你不需要一个循环

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: ')
[没有中断,没有导入,几乎没有代码…]

正如我的代码所指出的,对于3.2之前的Python版本,使用
set
符号进行成员资格测试是次优的。对于这些旧版本,使用
元组
可以避免每次执行函数时都在运行时计算集合

...
    # for python < 3.2
    if name[-4:] in ('.exe', '.bat'): return name
...
。。。
#对于python<3.2
如果('.exe','.bat')中的名称[-4:]:返回名称
...
您不需要循环

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: ')
[没有中断,没有导入,几乎没有代码…]

正如我的代码所指出的,对于3.2之前的Python版本,使用
set
符号进行成员资格测试是次优的。对于这些旧版本,使用
元组
可以避免每次执行函数时都在运行时计算集合

...
    # for python < 3.2
    if name[-4:] in ('.exe', '.bat'): return name
...
。。。
#对于python<3.2
如果('.exe','.bat')中的名称[-4:]:返回名称
...

感谢您的回复,但我正在寻找一种不使用endswith和break的解决方案。@LearnAndLearn sure,
endswith()
是额外的,已修复。是否有其他方法可以在不使用break和break的情况下停止循环importing@LearnAndLearn更新了一个选项,没有
break
@PadraicCunningham啊,是的,把事情搞砸了,谢谢你的关注!感谢您的回复,但我正在寻找一种不使用endswith和break的解决方案。@LearnAndLearn sure,
endswith()
是额外的,已修复。是否有其他方法可以在不使用break和break的情况下停止循环importing@LearnAndLearn更新了一个选项,没有
break
@PadraicCunningham啊,是的,把事情搞砸了,谢谢你的关注@你的编辑是灵感的源泉。TXX只是一个提醒,在旧Python上,set-literal方法的成本会更高<在所有版本的Python中,代码>元组s个文本缓存在每函数常量存储中,但是;在3.1和更早版本(包括所有2.x版本)上,每次都必须构建
,然后执行成员资格测试;通过每次重建
集合
来保存查找是一种净损失。对于两个元素,
元组
即使在3.2+中也很好。@ShadowRanger感谢您的关注、讨论和链接。现在你编辑的原因已经很清楚了。我已经相应地编辑了我的答案(嗯,我希望如此…@ShadowRanger你的编辑是灵感的来源。TXX只是一个提醒,在旧Python上,set-literal方法的成本会更高<在所有版本的Python中,代码>元组s个文本缓存在每函数常量存储中,但是;在3.1和更早版本(包括所有2.x版本)上,每次都必须构建
,然后执行成员资格测试;通过每次重建
集合
来保存查找是一种净损失。对于两个元素,
元组
即使在3.2+中也很好。@ShadowRanger感谢您的关注、讨论和链接。现在你编辑的原因已经很清楚了。我已经相应地编辑了我的答案(嗯,我希望如此…)