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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:01:57