您的位置:首页 > 编程语言 > Python开发

Python之FTP多线程下载文件之分块多线程文件合并

2013-08-31 23:05 615 查看

Python之FTP多线程下载文件之分块多线程文件合并

欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP多线程下载文件之多线程分块下载文件,主要讲述了Python中如何使用多线程对文件进行分块下载。

今天,我们接着上篇的思路,我们利用多线程对文件进行下载,待全部文件下载完成之后,我们需要对各个文件块进行合并,合并的过程比较简单:

1 def mergerFile(self, localFile, threadNumber):
2     """
3     Meger all the sub parts of the file into 1 file
4     another thread will be call to do this
5     """
6     try:
7         while 1:
8             subThread = threading.Thread(target = self.mergeFileExecutor, args = (localFile, threadNumber,))
9             subThread.start()
10             subThread.join()
11             if 1 == self.mergerFlag:
12                 self.mergerFlag = 0
13                 return False
14             # check if total size of part file equals to size of the whole file
15             localFileSize = os.path.getsize(localFile)
16             totalSize = 0
17             for i in range(0, threadNumber):
18                 totalSize += os.path.getsize(localFile + '.part.' + str(i))
19             if localFileSize == totalSize:
20                 break
21         return True
22     except Exception, diag:
23         self.recordLog(str(diag), 'error')
24         return False


其中的mergeFileExecutor函数如下:

1 def mergerFileExecutor(self, localFile, threadNumber):
2     try:
3         errorFlag = 0
4         fw = open(localFile, 'wb')
5         for i in range(0, threadNumber):
6             fname = localFile + '.part.' + str(i)
7             if not os.path.exists(fname):
8                 errorFlag = 1
9                 break
10             fr = open(fname, 'rb')
11             data = fr.read()
12             time.sleep(2)
13             fr.close()
14             fw.write(data)
15             fw.flush()
16             time.sleep(1)
17         fw.close()
18         if 1 == errorFlag:
19             # some part file is not available
20             self.mergerFlag = 1
21     except Exception, diag:
22         # error occr
23         self.mergerFlag = 1
24         self.recordLog(str(diag), 'error')


好了,我们分块下载到的文件已经被成功合并为一整个文件,当然为了保证文件的完整性,我们可以采用诸如md5sum等方式对文件进行验证,在此我采用了比较简单的比较文件大小的方式来验证文件的完整性,验证代码如下:

1 def checkSizeEqual(self, remoteFile, localFile):
2     '''
3     check the remote file size and the local file size.
4     if =, return true,
5     else, return false
6     '''
7     try:
8         remoteFileSize = self.ftp.size(remoteFile)
9         localFileSize = os.path.getsize(localFile)
10         if localFileSize == remoteFileSize:
11             return True
12         else:
13             return False
14     except Exception, diag:
15         print diag


好了,完成上述的准备工作,我们就可以进行FTP多线程文件下载的操作了,开始我们的main函数之旅吧!今天的内容就这些,在下一节,我将会给出main函数代码,并给出完整的FTP类的全部源代码下载,敬请关注!

感谢大家的阅读,希望能够帮到大家!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: