Skip to main content
 首页 » 编程设计

Python urllib2 恢复下载在网络重新连接时不起作用

2025年05月04日11jillzhang

我正在使用 urllib2 制作一个恢复下载器,大致基于 this方法。我可以结束程序并重新启动它,它会从停止的地方开始下载,下载最终大小与一次下载相同的文件。

但是,我在禁用和重新启用网络时对其进行了测试,但它无法正确下载。文件大小最终超过文件应有的长度,并且文件无法正常工作。有没有我遗漏了什么,或者这可能是 urllib2 错误?

    import urllib2 
    opener = urllib2.build_opener(); 
 
    self.count = 0 # Counts downloaded size. 
    self.downloading = True 
    while (not(self.success) and self.downloading): 
        try: 
            self.Err = "" 
            self._netfile = self.opener.open(self.url) 
            self.filesize = float(self._netfile.info()['Content-Length']) 
 
            if (os.path.exists(self.localfile) and os.path.isfile(self.localfile)): 
                self.count = os.path.getsize(self.localfile) 
            print self.count,"of",self.filesize,"downloaded." 
            if self.count >= self.filesize: 
                #already downloaded 
                self.downloading = False 
                self.success = True 
                self._netfile.close() 
                return 
 
            if (os.path.exists(self.localfile) and os.path.isfile(self.localfile)): 
                #File already exists, start where it left off: 
                #This seems to corrupt the file sometimes? 
                self._netfile.close() 
                req = urllib2.Request(self.url) 
                print "file downloading at byte: ",self.count 
                req.add_header("Range","bytes=%s-" % (self.count)) 
                self._netfile = self.opener.open(req) 
            if (self.downloading): #Don't do it if cancelled, downloading=false. 
                next = self._netfile.read(1024) 
                self._outfile = open(self.localfile,"ab") #to append binary 
                self._outfile.write(next) 
                self.readsize = desc(self.filesize) # get size mb/kb 
                self.count += 1024 
                while (len(next)>0 and self.downloading): 
                    next = self._netfile.read(1024) 
                    self._outfile.write(next) 
                    self.count += len(next) 
                self.success = True 
        except IOError, e: 
            print e 
            self.Err=("Download error, retrying in a few seconds: "+str(e)) 
            try: 
                self._netfile.close() 
            except Exception: 
                pass 
            time.sleep(8) #Then repeat 

请您参考如下方法:

我在 IOError 处理程序中添加了 self._outfile.close() 和 self._netfile.close() ,这似乎已经修复了它。我猜这个错误是由于没有关闭而再次打开追加造成的。