Python下载文件至本地目录C:\1\1及代码报错解决求助
解决Python文件下载问题(指定目录+修复报错)
首先,你的报错根源是代码里的一个调用错误:urllib.request.urlretrieve.urlopen(url)是错误写法——urlretrieve是urllib.request模块下的独立函数,它本身并没有urlopen属性,正确的方式是直接调用urllib.request.urlopen(url)。
另外,你的代码还有两处过时/遗漏的地方:
meta.getheaders("Content-Length")在Python 3.3+已经被弃用,改用meta.get("Content-Length")更稳妥- 需要提前确保目标目录
C:\1\1存在,否则保存文件时会抛出"找不到路径"的错误
下面是修正后的urllib版本代码,同时实现下载到指定目录:
import urllib.request import os # 目标保存目录,用r前缀避免转义字符问题 target_dir = r"C:\1\1" # 确保目录存在,不存在则自动创建;exist_ok=True避免目录已存在时报错 os.makedirs(target_dir, exist_ok=True) url = "http://download.thinkbroadband.com/10MB.zip" file_name = url.split('/')[-1] # 拼接完整的文件保存路径 save_path = os.path.join(target_dir, file_name) # 正确调用urlopen获取响应对象 u = urllib.request.urlopen(url) f = open(save_path, 'wb') # 改用get()方法获取响应头,替代过时的getheaders content_length = u.getheader("Content-Length") file_size = int(content_length) if content_length else 0 print(f"Downloading: {file_name} Bytes: {file_size}") file_size_dl = 0 block_sz = 8192 while True: buffer = u.read(block_sz) if not buffer: break file_size_dl += len(buffer) f.write(buffer) # 实时打印下载进度 if file_size > 0: status = f"{file_size_dl:10d} [{file_size_dl * 100. / file_size:3.2f}%]" status = status + chr(8)*(len(status)+1) print(status, end='') f.close() print("\nDownload completed!")
如果你觉得urllib的写法比较繁琐,推荐使用更现代、易读的requests库(需要先通过pip install requests安装),下面是用requests实现的版本:
import requests import os target_dir = r"C:\1\1" os.makedirs(target_dir, exist_ok=True) url = "http://download.thinkbroadband.com/10MB.zip" file_name = url.split('/')[-1] save_path = os.path.join(target_dir, file_name) # stream=True开启流式下载,适合大文件,避免一次性加载到内存 response = requests.get(url, stream=True) # 检查请求是否成功,若返回4xx/5xx状态码直接抛出异常 response.raise_for_status() file_size = int(response.headers.get('Content-Length', 0)) print(f"Downloading: {file_name} Bytes: {file_size}") file_size_dl = 0 block_sz = 8192 # 用with语句自动管理文件句柄,无需手动close with open(save_path, 'wb') as f: for chunk in response.iter_content(chunk_size=block_sz): if chunk: f.write(chunk) file_size_dl += len(chunk) if file_size > 0: status = f"{file_size_dl:10d} [{file_size_dl * 100. / file_size:3.2f}%]" status = status + chr(8)*(len(status)+1) print(status, end='') print("\nDownload completed!")
关键细节说明:
os.makedirs(target_dir, exist_ok=True):保证目标目录存在,即使目录已存在也不会报错stream=True(requests版本):针对大文件优化,分块下载,避免内存占用过高response.raise_for_status():快速排查请求失败的问题,比如链接失效、权限不足等
内容的提问来源于stack exchange,提问作者user9171937
相关产品推荐
相关产品推荐

