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

Python urllib2保存PDF文件时卡顿的原因及解决方法

Python下载PDF时f.write()挂起的原因与解决办法

我来帮你分析下这个问题哈,之前处理类似下载任务时也碰到过这种卡顿情况,主要有这几个可能的原因,对应的解决办法也给你整理好了:

可能的原因

  • 网络传输瓶颈:你用resp.read()是一次性把整个PDF文件读到内存里,如果PDF很大(比如几十上百MB),或者网络不稳定(比如服务器限速、网络波动丢包),这个读取过程就会卡住,进而导致后续的f.write()也跟着挂起——毕竟一次性拉取大文件很容易因为网络问题长时间等待。
  • 服务器端限制:有些网站会对单次请求的连接时长、数据传输速率做限制,urllib2的默认请求没有超时设置,一旦服务器故意“hold住”连接不返回数据,你的程序就会一直傻等。
  • 磁盘IO阻塞:如果你的保存目录所在的磁盘正在高负载运行(比如同时在写入大量文件、磁盘本身是低速机械盘),f.write()会因为等待磁盘空闲而出现卡顿。

对应的解决办法

1. 分块读取写入,避免一次性加载大文件

把一次性读取改成按固定大小分块读取写入,这样不仅能降低内存占用,还能避免因为大文件读取导致的长时间挂起:

import urllib2

pdf_url = "你的PDF文件地址"
save_path = "/home/mysaveFile/myDownloadedPdf_{}.pdf".format(number)

resp = urllib2.urlopen(pdf_url)
# 每次读取1MB的块,可根据网络情况调整大小
chunk_size = 1024 * 1024
with open(save_path, 'wb') as f:
    while True:
        chunk = resp.read(chunk_size)
        if not chunk:
            break
        f.write(chunk)

2. 给请求添加超时时间

urllib2.urlopen()支持设置超时参数,这样如果服务器超过指定时间没响应,程序会直接抛出超时异常,不会一直挂着:

# 设置10秒超时,可根据实际网络情况调整
resp = urllib2.urlopen(pdf_url, timeout=10)

3. 改用更易用的requests库

urllib2是比较老旧的库,requests的API更友好,处理网络问题也更灵活,自带分块下载和超时设置:

import requests

pdf_url = "你的PDF文件地址"
save_path = "/home/mysaveFile/myDownloadedPdf_{}.pdf".format(number)

# stream=True开启分块下载,timeout设置10秒超时
with requests.get(pdf_url, stream=True, timeout=10) as r:
    r.raise_for_status()  # 检查请求是否成功,失败会抛出异常
    with open(save_path, 'wb') as f:
        for chunk in r.iter_content(chunk_size=1024*1024):
            f.write(chunk)

4. 检查磁盘状态

如果怀疑是磁盘问题,可以先查看保存目录所在磁盘的剩余空间、IO使用率(比如用Linux的iostat命令),尽量避免在磁盘繁忙的时候执行下载写入操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:30:32