You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 Python作业:文件扩展名识别程序输出错误求助

问题分析与修复

你的代码核心问题出在条件判断的逻辑写法错误,导致第一个if分支永远为真,不管输入的是什么后缀。

错误原因

看这段代码:

if ".gif" or ".png" or ".jpeg" or ".jpg" in name:

Python的逻辑运算优先级会先处理or两边的表达式,而".gif"是一个非空字符串,在布尔判断里会被视为True。所以整个条件等价于True or ...,结果永远是True——不管输入的文件名里有没有这些后缀,第一个if都会被触发,这就是为什么输入file.zip会走到image/zip的输出分支。

同样的问题也存在于第二个elif:elif ".pdf" or ".zip" in name:,不过因为第一个if已经永远触发了,这个分支根本不会被执行到。

修复方案

这里提供两种更严谨的写法:

写法1:提取后缀后匹配列表

name = input("Give me a filename:").lower()

# 提取最后一个后缀,无后缀则为空字符串
suffix = name.split(".")[-1] if "." in name else ""

if suffix in ["gif", "png", "jpeg", "jpg"]:
    print(f'image/{suffix}')
elif suffix in ["pdf", "zip"]:
    print(f'application/{suffix}')
elif suffix == "txt":
    print("text/plain")
else: 
    print("application/octet-stream")

写法2:用endswith精准判断末尾后缀

name = input("Give me a filename:").lower()

if name.endswith((".gif", ".png", ".jpeg", ".jpg")):
    print(f'image/{name.split(".")[-1]}')
elif name.endswith((".pdf", ".zip")):
    print(f'application/{name.split(".")[-1]}')
elif name.endswith(".txt"):
    print("text/plain")
else: 
    print("application/octet-stream")

关键改进点

  1. 用endswith()方法判断后缀更准确,能避免文件名中间出现.导致的误判(比如file.gif.txt会被正确识别为txt文件)
  2. 条件判断逻辑严谨,确保只有当文件名确实以指定后缀结尾时,才进入对应分支
  3. 第一种写法先提取后缀再判断,逻辑更清晰,也方便后续维护后缀列表

内容的提问来源于stack exchange,提问作者Philly Billy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:32:14