文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python ftp常用操作

2023-01-31 01:39

关注

需求

快速进行ftp上传 ,下载,查询文件

原来直接在shell下操作:需要【连接,输用户名,输密码,单文件操作,存在超时限制】

太过于繁琐,容易操作失败

改进

一句命令,搞定多文件上传,下载,查询,列表等操作

后期可以加入更强大的功能

源代码

#!/usr/bin/python# -*- coding:utf-8 -*-#ftp.py#    wklken@yeah.net#this script is used to do some operations more convenient via ftp
  #1.[p]upload many files in the same time,show md5s
  #2.[g]download many files in the same time,show md5s
  #3.[l]list all the files on ftp site
  #4.[f]search a file on ftp site,return True or Flase
  #5.[h]show help info
  
  #add upload and download operations  20111210 version0.1
  #add md5sum after ops 20120308 version0.2
  import sys,os,ftplib,socket
  CONST_HOST = "ip"
  CONST_USERNAME = "username"
  CONST_PWD = "pwd"
  CONST_BUFFER_SIZE = 8192
  COLOR_NONE = "\033[m"
  COLOR_GREEN = "\033[01;32m"
  COLOR_RED = "\033[01;31m"
  COLOR_YELLOW = "\033[01;33m"
  
  def connect():
    try:
        ftp = ftplib.FTP(CONST_HOST)
        ftp.login(CONST_USERNAME,CONST_PWD)
        return ftp
    except socket.error,socket.gaierror:
        print("FTP is unavailable,please check the host,username and password!")
        sys.exit(0)def disconnect(ftp):
    ftp.quit()
    
    def upload(ftp, filepath):
        f = open(filepath, "rb")
        file_name = os.path.split(filepath)[-1]
        try:
            ftp.storbinary('STOR %s'%file_name, f, CONST_BUFFER_SIZE)
        except ftplib.error_perm:
            return False
            return True
            
    def download(ftp, filename):
        f = open(filename,"wb").write
        try:
            ftp.retrbinary("RETR %s"%filename, f, CONST_BUFFER_SIZE)
        except ftplib.error_perm:
            return False
        return True
        
    def list(ftp):
        ftp.dir()def find(ftp,filename):
        ftp_f_list = ftp.nlst()
        if filename in ftp_f_list:
            return True
        else:
            return Falsedef help():
    print("help info:")
    print("[./ftp.py l]\t show the file list of the ftp site ")
    print("[./ftp.py f filenamA filenameB]\t check if the file is in the ftp site")
    print("[./ftp.py p filenameA filenameB]\t upload file into ftp site")
    print("[./ftp.py g filenameA filenameB]\t get file from ftp site")
    print("[./ftp.py h]\t show help info")
    print("other params are invalid")def main():
    args = sys.argv[1:]
    if len(args) == 0:
        print("Params needed!")
        sys.exit(0)

    ftp = connect()

    success_list = []
    failed_list = []

    if args[0] == "p":
        f_list = args[1:]

        for up_file in f_list:
        if not os.path.exists(up_file):
            print(("UPLOAD: %s "+COLOR_RED+"FAILED"+COLOR_NONE+"  :file not exist")%up_file)
            continue
        elif not os.path.isfile(up_file):
            print(("UPLOAD: %s "+COLOR_RED+"FAILED"+COLOR_NONE+"  :%s is not a file")%(up_file,up_file))
            continue

        if upload(ftp, up_file):
            success_list.append(up_file)
        else:
            failed_list.append(up_file)
        if len(success_list) > 0 :
        print((COLOR_GREEN + "UPLOAD SUCCESS: %s" + COLOR_NONE)%(" ".join(success_list)))
        print("md5sum:")
        for f in success_list:
            print( os.popen("md5sum " + f).read()[:-1])
        if len(failed_list) > 0:
        print((COLOR_RED + "UPLOAD FAILED: %s" + COLOR_NONE)%(" ".join(failed_list)))

    elif args[0] == "g":
        f_list = args[1:]

        for down_file in f_list:
        if not find(ftp,down_file):
            print(("DOWNLOAD: %s "+COLOR_RED+"FAILED"+COLOR_NONE+"  :%s is not in the ftp site")%(down_file,down_file))
            continue

        if download(ftp, down_file):
            success_list.append(down_file)
        else:
            failed_list.append(down_file)
        if len(success_list) > 0 :
        print((COLOR_GREEN + "DOWNLOAD SUCCESS: %s" + COLOR_NONE)%(" ".join(success_list)))
        print("md5sum:")
        for f in success_list:
            print( os.popen("md5sum " + f).read()[:-1])
        if len(failed_list) > 0:
        print((COLOR_RED + "DOWNLOAD FAILED: %s" + COLOR_NONE)%(" ".join(failed_list)))

    elif args[0] == "l":
        list(ftp)
    elif args[0] == "f":
        f_list = args[1:]
        for f_file in f_list:
        if find(ftp,f_file):
            print(("SEARCH: %s "+COLOR_GREEN+"EXIST"+COLOR_NONE)%f_file)
        else:
            print(("SEARCH: %s "+COLOR_RED+"NOT EXIST"+COLOR_NONE)%f_file)
            if len(f_file) > 3:
            print("Similar File List:")
            s = ftp.nlst()
            print  ", ".join([k for k in s if f_file in k])

    elif args[0] == "h":
        help()
    else:
        print("args are invalid!")
        help()

    disconnect(ftp)if __name__ == "__main__":
  main()

常用函数

用手册查看,以下只是简略,因为没用用到,[待整理]:

login(user='',passwd='', acct='')     登录到FTP 服务器,所有的参数都是可选的
pwd()                       当前工作目录
cwd(path)                   把当前工作目录设置为path
dir([path[,...[,cb]])       显示path 目录里的内容,可选的参数cb 是一个回调函数,会被传给retrlines()方法
nlst([path[,...])           与dir()类似,但返回一个文件名的列表,而不是显示这些文件名
retrlines(cmd [, cb])       给定FTP 命令(如“RETR filename”),用于下载文本文件。可选的回调函数cb 用于处理文件的每一行
retrbinary(cmd, cb[,bs=8192[, ra]])     与retrlines()类似,只是这个指令处理二进制文件。回调函数cb 用于处理每一块(块大小默认为8K)下载的数据。
storlines(cmd, f)   给定FTP 命令(如“STOR filename”),以上传文本文件。要给定一个文件对象f
storbinary(cmd, f[,bs=8192])    与storlines()类似,只是这个指令处理二进制文件。要给定一个文件对象f,上传块大小bs 默认为8Kbs=8192])
rename(old, new)    把远程文件old 改名为new
delete(path)     删除位于path 的远程文件
mkd(directory)  创建远程目录


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯