如何通过数字输入选择列表文件并实现输入合法性校验?
实现数字选择文件删除功能(带输入验证)
我来帮你完善这个文件删除功能,下面是完整的可运行代码,我会详细解释每个关键部分:
import os # 定义目标文件夹路径,方便后续修改 calendar_dir = os.path.expanduser("~/Desktop/Sam's Calendar") # 获取文件夹中的所有文件(排除子文件夹) files = [f for f in os.listdir(calendar_dir) if os.path.isfile(os.path.join(calendar_dir, f))] # 处理空文件列表的情况 if not files: print("No reminders exist in the directory.") exit() # 展示带编号的文件列表(显示去掉扩展名的名称) print("The following reminders currently exist:\n") for idx, filename in enumerate(files, 1): display_name = os.path.splitext(filename)[0] print(f"{idx}. {display_name}") # 循环获取用户输入,直到输入有效 while True: deletion_input = input("\nPlease select the number corresponding to the reminder you want to delete.\n\n") try: # 尝试将输入转为整数 selection = int(deletion_input) # 验证数字是否在有效范围内 if 1 <= selection <= len(files): break else: print(f"❌ Error: Please enter a number between 1 and {len(files)}.") except ValueError: # 处理非数字输入的情况 print("❌ Error: Please enter a valid integer (e.g., 1, 2).") # 获取要删除的文件的完整路径 target_file = os.path.join(calendar_dir, files[selection - 1]) # 执行删除操作并处理可能的异常 try: os.remove(target_file) print(f"✅ Successfully deleted reminder: {os.path.splitext(files[selection - 1])[0]}") except OSError as e: print(f"❌ Failed to delete file: {str(e)}")
关键功能说明:
- 保留完整文件名:原代码中去掉了文件扩展名,但删除操作需要完整文件名,所以我们先存储带扩展名的文件列表,展示时再提取无扩展名的名称给用户看。
- 输入验证机制:
- 用
try-except捕获非数字输入的错误,提示用户输入有效整数 - 检查输入数字是否在
1到文件总数的范围内,拒绝0或超出范围的输入 - 用
while True循环确保用户输入有效后才继续执行
- 用
- 边界情况处理:如果文件夹里没有文件,直接提示并退出,避免后续代码报错
- 安全删除:用
try-except包裹删除操作,处理文件不存在、权限不足等异常,给用户清晰的反馈
内容的提问来源于stack exchange,提问作者KungenSam
相关产品推荐
相关产品推荐

