- 论坛徽章:
- 0
|
公司的研发写的ftp客户端老是出问题,数据没法时时接收下来,年后这个工程师又跳槽了,害的我这里运维天天到晚心都悬着。
这几天想用python改写ftp下载。对于python开发还有许多困扰,在这里请教大家了。
实现功能:
远程ftp 服务器每分钟产生一个文件,我想python写的ftp能时时读取远程文件,如果文件存在就下载,如果远程目录里的文件都下载完了,就等待30秒再次读取。
下面我写的下载,还不是很全。log日志信息也没有打印。
主要疑问:
1. 我如何能让ftp不关闭,时时在读入远程目录下的文件
2. 每次下载前能知道我上次下载到那个文件了- #!/usr/bin/env python
- #encoding=utf-8
- #author :
- from ftplib import FTP
- import sys,os
- import datetime
-
- class MyFTP(object):
- '''
- conncet to FTP Server
- '''
- def __init__(self,remoteip,remoteport,loginname,loginpassword):
- self.remoteip = remoteip
- self.remoteport = remoteport
- self.loginname = loginname
- self.loginpassword = loginpassword
- def ConnectFTP(self):
- ftp = FTP()
- try:
- ftp.connect(self.remoteip,self.remoteport)
- except Exception, e:
- print >> sys.stderr, "conncet failed - %s" % e
- sys.exit()
- else:
- try:
- ftp.login(self.loginname,self.loginpassword)
- except Exception, e:
- print >>sys.stderr, 'login failed - %s' % e
- sys.exit()
- else:
- print 'login success'
- return ftp
-
- def download(self,remotePath,PrelocalPath):
- #change the remote directory and get the remote file size
- ftp = self.ConnectFTP()
- ftp.set_pasv(0)
- try:
- ftp.cwd(remotePath)
- except Exception, e:
- print >> sys.stderr, 'remote directory does not exist -%s' % e
- sys.exit()
- # 按天生成本地存放路径
- localPath = PrelocalPath + os.sep + datetime.datetime.now().strftime("%Y%m%d")
- # FTP Services 文件列表
- remoteFileList = ftp.nlst()
- for remotefile in remoteFileList:
- fsize=ftp.size(remotefile)
- if fsize==0 : #localfime's site is 0
- continue
-
- #检查本地文件不存在,获得本地文件大小
- lsize=0L
- localfile = localPath + os.sep + remotefile
- if os.path.isdir(localPath):
- if os.path.isfile(localfile):
- lsize=os.stat(localfile).st_size
- else:
- # 如果指定的存放目录不存在,文件肯定不存在
- # 此时不需要获取文件大小
- os.makedirs(localPath)
-
- if lsize >= fsize:
- continue
- blocksize=1024 * 1024
- ftp.voidcmd('TYPE I')
- conn = ftp.transfercmd('RETR ' + remotefile,lsize)
- lwrite=open(localfile,'ab')
- while True:
- data=conn.recv(blocksize)
- if not data:
- break
- lwrite.write(data)
- #cmpsize+=len(data)
- lwrite.close()
- ftp.voidcmd('NOOP')
- ftp.voidresp()
- conn.close()
- ftp.quit()
- if __name__=='__main__':
- ftp = MyFTP("127.0.0.1",21,"ftpuser","123456")
- ftp.download('/home/ftpuser/debian','/root/download')
复制代码 |
|