使用Image.open(requests.get())获取临时图片时无法获取文件扩展名求助
解决图片保存时的文件扩展名错误问题
我一眼就发现了代码里的核心问题——你生成文件名的时候漏掉了扩展名的分隔符.,这才导致系统识别不了文件格式!
先看你这段代码:
picture_fn = random_hex + f_ext
举个例子:如果random_hex是abc12345,f_ext是png,那生成的文件名就是abc12345png,系统根本没法识别这是个PNG文件,自然会抛出ValueError: unknown file extension的错误。
第一步:修复文件名拼接
把文件名生成的代码改成下面这样,加上.分隔符:
picture_fn = f"{random_hex}.{f_ext}"
修改后文件名会变成abc12345.png,系统就能正确识别扩展名了,这应该能解决你当前的大部分问题。
第二步:处理格式异常情况
虽然你说多数图片是PNG或JPEG,但还是要考虑极端情况——比如Image.format为空,或者遇到不常见的图片格式。可以加个格式映射的逻辑,避免程序崩溃:
# 建立格式到扩展名的映射,覆盖常见格式 format_ext_map = { 'jpeg': 'jpg', 'png': 'png', 'gif': 'gif', 'bmp': 'bmp' } # 优先用PIL识别的格式,没有的话默认用jpg f_ext = format_ext_map.get(i.format.lower() if i.format else '', 'jpg')
第三步:从响应头获取扩展名(更可靠的方案)
另外,你还可以直接从Google Places API的响应头里提取文件类型,这比用PIL识别更准确:
response = requests.get(google_url, stream=True) # 从Content-Type字段获取格式,比如image/png、image/jpeg content_type = response.headers.get('Content-Type') if content_type and '/' in content_type: f_ext = content_type.split('/')[-1].lower() else: # 兜底用jpg f_ext = 'jpg' i = Image.open(response.raw)
这种方法能直接拿到接口返回的文件类型,避免PIL识别格式时可能出现的误差。
你的i.show()能正常打开图片,说明图片数据本身是没问题的,先把第一步的文件名拼接问题解决,应该就能正常运行了!
内容的提问来源于stack exchange,提问作者Emmet Gibney
相关产品推荐
相关产品推荐

