如何在urlretrieve中用变量指定目标文件?遇FileNotFoundError求指导
解决urllib.request.urlretrieve抛出的FileNotFoundError问题
我一眼就看出问题出在你代码的第7行啦!你写的'y/z.s'是一个固定字符串,Python会直接把它当作路径去寻找,而不是替换成你之前输入的变量y、z和s。这就导致系统找不到名为y的文件夹和z.s的文件,自然抛出了FileNotFoundError。
错误原因详解
当你用单引号把y/z.s包起来时,Python不会识别里面的y、z、s是变量,只会把它当成字面意义上的路径:当前工作目录下的y子文件夹里的z.s文件。而你实际想要的是把用户输入的目标地址、文件名和扩展名拼接成真实的路径。
修正后的代码方案
这里推荐使用Python的f-string(Python 3.6+支持)来优雅地拼接路径变量,同时为了避免目标目录不存在的问题,我们可以提前用os模块创建目录:
import urllib.request import os # 获取用户输入 x = input("enter the source link: ") # 文件下载源地址 y = input("enter the destination address: ") # 文件保存目录 z = input("enter file name: ") # 保存的文件名 s = input("enter extension type: ") # 文件扩展名 # 确保目标目录存在,不存在则创建(包括多级目录) os.makedirs(y, exist_ok=True) # 拼接完整的保存路径:目标目录 + 文件名.扩展名 # 用os.path.join自动适配不同系统的路径分隔符(Windows用\,Linux/macOS用/) full_path = os.path.join(y, f"{z}.{s}") # 执行下载 print('Beginning file download...') urllib.request.urlretrieve(x, full_path) print('File downloaded successfully!')
额外注意事项
- 使用
os.makedirs(y, exist_ok=True)可以避免因为目标目录不存在而报错,exist_ok=True表示如果目录已经存在也不会抛出错误。 - 如果你担心用户输入的扩展名带
.(比如输入.txt而不是txt),可以加一行处理:s = s.lstrip('.'),确保路径格式正确。
内容的提问来源于stack exchange,提问作者I8PI
相关产品推荐
相关产品推荐

