免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4073 | 回复: 6
打印 上一主题 下一主题

在生产环境下,实际应用过ftplib模块进来指导 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-16 14:50 |只看该作者 |倒序浏览
公司的研发写的ftp客户端老是出问题,数据没法时时接收下来,年后这个工程师又跳槽了,害的我这里运维天天到晚心都悬着。
这几天想用python改写ftp下载。对于python开发还有许多困扰,在这里请教大家了。

实现功能:
远程ftp 服务器每分钟产生一个文件,我想python写的ftp能时时读取远程文件,如果文件存在就下载,如果远程目录里的文件都下载完了,就等待30秒再次读取。

下面我写的下载,还不是很全。log日志信息也没有打印。

主要疑问:
1. 我如何能让ftp不关闭,时时在读入远程目录下的文件
2. 每次下载前能知道我上次下载到那个文件了
  1. #!/usr/bin/env python
  2. #encoding=utf-8
  3. #author :

  4. from ftplib import FTP   
  5. import sys,os
  6. import datetime
  7.    
  8. class MyFTP(object):
  9.         '''  
  10.         conncet to FTP Server  
  11.         '''   
  12.         def __init__(self,remoteip,remoteport,loginname,loginpassword):
  13.                 self.remoteip = remoteip
  14.                 self.remoteport = remoteport
  15.                 self.loginname = loginname
  16.                 self.loginpassword = loginpassword

  17.         def ConnectFTP(self):   
  18.                 ftp = FTP()  

  19.                 try:  
  20.                         ftp.connect(self.remoteip,self.remoteport)  
  21.                 except Exception, e:
  22.                         print >> sys.stderr, "conncet failed - %s" % e
  23.                         sys.exit()
  24.                 else:   
  25.                         try:   
  26.                                 ftp.login(self.loginname,self.loginpassword)   
  27.                         except Exception, e:
  28.                                 print >>sys.stderr, 'login failed - %s' % e
  29.                                 sys.exit()
  30.                         else:
  31.                                 print 'login success'
  32.                 return ftp

  33.                
  34.         def download(self,remotePath,PrelocalPath):   
  35.                 #change the remote directory and get the remote file size   
  36.                 ftp = self.ConnectFTP()
  37.                 ftp.set_pasv(0)
  38.                 try:
  39.                         ftp.cwd(remotePath)
  40.                 except Exception, e:
  41.                         print >> sys.stderr, 'remote directory does not exist -%s' % e
  42.                         sys.exit()
  43.                 # 按天生成本地存放路径
  44.                 localPath = PrelocalPath + os.sep + datetime.datetime.now().strftime("%Y%m%d")
  45.                 # FTP Services 文件列表
  46.                 remoteFileList = ftp.nlst()
  47.                 for remotefile in remoteFileList:                       
  48.                         fsize=ftp.size(remotefile)   
  49.                         if fsize==0 : #localfime's site is 0
  50.                                 continue
  51.                        
  52.                         #检查本地文件不存在,获得本地文件大小
  53.                         lsize=0L
  54.                         localfile = localPath + os.sep + remotefile
  55.                         if os.path.isdir(localPath):
  56.                                 if os.path.isfile(localfile):
  57.                                         lsize=os.stat(localfile).st_size
  58.                         else:
  59.                                 # 如果指定的存放目录不存在,文件肯定不存在
  60.                                 # 此时不需要获取文件大小
  61.                                 os.makedirs(localPath)
  62.                                
  63.                         if lsize >= fsize:   
  64.                                 continue   
  65.                         blocksize=1024 * 1024
  66.                         ftp.voidcmd('TYPE I')
  67.                         conn = ftp.transfercmd('RETR ' + remotefile,lsize)
  68.                         lwrite=open(localfile,'ab')
  69.                         while True:
  70.                                 data=conn.recv(blocksize)
  71.                                 if not data:
  72.                                         break
  73.                                 lwrite.write(data)
  74.                                 #cmpsize+=len(data)
  75.                         lwrite.close()
  76.                         ftp.voidcmd('NOOP')
  77.                         ftp.voidresp()
  78.                         conn.close()
  79.                 ftp.quit()



  80. if __name__=='__main__':
  81.         ftp = MyFTP("127.0.0.1",21,"ftpuser","123456")
  82.         ftp.download('/home/ftpuser/debian','/root/download')
复制代码

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2014-02-16 15:01 |只看该作者
坦白说自己没在生产环境用过ftplib,但这类需求比较常见,如果是两台UNIX/Linux服务器的话,用rsync一个命令就搞定了,根本不用写什么代码。

论坛徽章:
0
3 [报告]
发表于 2014-02-17 09:43 |只看该作者
回复 2# timespace
多家公司完成一个项目,另一家公司对外提供的就是FTP接口服务器。我在的这家公司如果要计算,就得时时去读取FTP服务器。
处处受控与人。

   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
4 [报告]
发表于 2014-02-17 10:18 |只看该作者
回复 3# ontherd
了解。
1. 我如何能让ftp不关闭,时时在读入远程目录下的文件
2. 每次下载前能知道我上次下载到那个文件了

我没仔细研究过FTP协议,但印象中不支持这样的功能?其实我也有个疑问,既然是FTP提供数据文件,意味着实时性要求不高,#1不太必要吧,如果数据量不大,可以从头开始下载吗?如果可以,#2也没必要。你既然从头实现别人的功能,应该先尽量保持简单,只要最终得到数据文件就行,附加功能能省就省了吧。

   

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
5 [报告]
发表于 2014-02-17 11:10 |只看该作者
你可以分步实现:
1. 实现文件下载
2. 实现遍历文件树
3. 通过本地建立一个专门保存已经下载的文件记录的文件,来和2中结果比较来确定需要下载哪些文件

论坛徽章:
0
6 [报告]
发表于 2014-02-20 09:58 |只看该作者
回复 5# icymirror

好想法,如果有问题,再向你请教。


   

论坛徽章:
0
7 [报告]
发表于 2014-02-21 12:47 |只看该作者
本帖最后由 nmweizi 于 2014-02-21 12:47 编辑

用lftp的mirror命令就搞定了。放到crontab定时执行就可以了吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP