pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

使用 Python 腳本將文件夾從本地系統上傳到 FTP

Upload folders from local system to FTP using Python script(使用 Python 腳本將文件夾從本地系統上傳到 FTP)
本文介紹了使用 Python 腳本將文件夾從本地系統上傳到 FTP的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我必須使用 Python 腳本自動將文件夾上傳到 FTP.我可以上傳單個文件,但不能上傳帶有子文件夾和文件的文件夾.我做了很多搜索,但失敗了.有人可以幫我嗎?提前致謝.

I have to automatically upload folders to an FTP using a Python script. I am able to upload a single file, but not folders with subfolders and files in them. I did a lot of search, but failed. Could some one help me out here? Thanks in advance.

#! /usr/bin/python

import ftplib
s = ftplib.FTP('serverip','usrname','password') 
file = '/home/rock/test.txt'
ftppath = '/IT'
filename = "rak"
s.cwd(ftppath)
f = open(file,'rb')                
s.storbinary('STOR ' + filename, f)         

f.close()                                
s.quit()

推薦答案

你基本上需要使用 os.walk() 來抓取這些文件并傳輸它們.

You basically need to use os.walk() to grab those files and transfer them.

這是我為自己編寫的腳本,用于滿足您的大部分要求.我很久以前寫的,所以如果我再寫一次,我可能會做不同的事情,但我從中得到了很多用處.

Here's a script I wrote for myself to do much of what your asking. I wrote it a long time ago, so I'd probably do it differently if I wrote it again, but I get a lot of use out of it.

它導入 psftplib,這是我為 putty sftp 編寫的包裝器.隨意刪除這些引用,或在以下位置獲取庫:http://code.google.com/p/psftplib/source/browse/trunk/psftplib.py

It imports psftplib, which is a wrapper I wrote for the putty sftp. Feel free to remove these references, or grab the lib at: http://code.google.com/p/psftplib/source/browse/trunk/psftplib.py

# -*- coding: utf8 -*-
'''This tool will ftp all the files in a given directory to a given location

if the file ftpallcfg.py exists in the directory it will be loaded and the values within it used, 
with the current directory used as the source directory.

ftpallcfg.py file contains the following variables.
===========================
server = <server to ftp to>
username = <Username for access to given server>
remote_dir = <remote server directory>
encrypt= True/False
monitor = True/False
walk = True/False
=========================== 
'''
import ftplib
import os
import getpass
import sys
import time
import socket
import psftplib

__revision__ = 1.11

SLEEP_SECONDS = 1


class FtpAddOns():
    PATH_CACHE = []

    def __init__(self, ftp_h):
        self.ftp_h = ftp_h

    def ftp_exists(self, path):
        '''path exists check function for ftp handler'''
        exists = None
        if path not in self.PATH_CACHE:
            try:
                self.ftp_h.cwd(path)
                exists = True
                self.PATH_CACHE.append(path)
            except ftplib.error_perm, e:
                if str(e.args).count('550'):    
                    exists = False
        else:
            exists = True

        return exists


    def ftp_mkdirs(self, path, sep='/'):
        '''mkdirs function for ftp handler'''
        split_path = path.split(sep)

        new_dir = ''
        for server_dir in split_path:
            if server_dir:
                new_dir += sep + server_dir
                if not self.ftp_exists(new_dir):
                    try:
                        print 'Attempting to create directory (%s) ...' % (new_dir),
                        self.ftp_h.mkd(new_dir)
                        print 'Done!'
                    except Exception, e:
                        print 'ERROR -- %s' % (str(e.args))                


def _get_local_files(local_dir, walk=False):
    '''Retrieve local files list
    result_list == a list of dictionaries with path and mtime keys. ex: {'path':<filepath>,'mtime':<file last modified time>}
    ignore_dirs == a list of directories to ignore, should not include the base_dir.
    ignore_files == a list of files to ignore.
    ignore_file_ext == a list of extentions to ignore. 
    ''' 
    result_list = []   

    ignore_dirs = ['CVS', '.svn']
    ignore_files = ['.project', '.pydevproject']
    ignore_file_ext = ['.pyc']

    base_dir = os.path.abspath(local_dir)

    for current_dir, dirs, files in os.walk(base_dir):
        for this_dir in ignore_dirs:
            if this_dir in dirs:
                dirs.remove(this_dir)

        sub_dir = current_dir.replace(base_dir, '')
        if not walk and sub_dir:
            break

        for this_file in files:
            if this_file not in ignore_files and os.path.splitext(this_file)[-1].lower() not in ignore_file_ext:
                filepath = os.path.join(current_dir, this_file)
                file_monitor_dict = {
                                     'path': filepath, 
                                     'mtime': os.path.getmtime(filepath)
                                     } 
                result_list.append(file_monitor_dict)
    return result_list 


def monitor_and_ftp(server, 
                      username, 
                      password, 
                      local_dir, 
                      remote_dir, 
                      encrypt=False, 
                      walk=False):
    '''Monitor local files and when an update is found connect and upload'''
    print 'Monitoring changes in (%s).' % (os.path.abspath(local_dir))
    print '(Use ctrl-c to exit)'

    last_files_list = _get_local_files(local_dir)

    while True:
        try:
            time.sleep(SLEEP_SECONDS)

            latest_files_list = _get_local_files(local_dir)

            files_to_update = []

            for idx in xrange(len(latest_files_list)):

                if idx < len(last_files_list):
                    # compare last modified times
                    if latest_files_list[idx]['mtime'] > last_files_list[idx]['mtime']:
                        files_to_update.append(latest_files_list[idx])

                else:
                    # add the file to the list (new file)
                    files_to_update.append(latest_files_list[idx])

            if files_to_update:
                print
                print 'Detected NEW or CHANGED file(s), attempting to send ...'
                print
                is_success = upload_all(server,
                                        username,
                                        password,
                                        local_dir, 
                                        remote_dir, 
                                        files_to_update, 
                                        encrypt, 
                                        walk)

                if not is_success:
                    break

            else:
                print '.',

            last_files_list = latest_files_list[:] # copy the list to hold
        except KeyboardInterrupt:
            print
            print 'Exiting.'
            break


def upload_all(server, 
                username, 
                password, 
                base_local_dir, 
                base_remote_dir, 
                files_to_update=None, 
                encrypt=False, 
                walk=False):
    '''Upload all files in a given directory to the given remote directory'''
    continue_on = False
    login_ok = False
    server_connect_ok = False

    base_local_dir = os.path.abspath(base_local_dir)
    base_remote_dir = os.path.normpath(base_remote_dir)

    if files_to_update:
        local_files = files_to_update
    else:
        local_files = _get_local_files(base_local_dir, walk)

    if local_files:
        if not encrypt: # Use standard FTP
            ftp_h = ftplib.FTP()
        else: # Use sftp
            ftp_h = psftplib.SFTP()

        try:
            ftp_h.connect(server)
            server_connect_ok = True
        except socket.gaierror, e:
            print 'ERROR -- Could not connect to (%s): %s' % (server, str(e.args))
        except IOError, e:
            print 'ERROR -- File not found: %s' % (str(e.args))
        except socket.error, e:
            print 'ERROR -- Could not connect to (%s): %s' % (server, str(e.args))

        ftp_path_tools = FtpAddOns(ftp_h)

        if server_connect_ok:
            try:
                ftp_h.login(username,password)
                print 'Logged into (%s) as (%s)' % (server, username)
                login_ok = True
            except ftplib.error_perm, e:
                print 'ERROR -- Check Username/Password: %s' % (str(e.args))
            except psftplib.ProcessTimeout, e:
                print 'ERROR -- Check Username/Password (timeout): %s' % (str(e.args))

            if login_ok:

                for file_info in local_files:
                    filepath = file_info['path']

                    path, filename = os.path.split(filepath)
                    remote_sub_path = path.replace(base_local_dir, '')
                    remote_path = path.replace(base_local_dir, base_remote_dir)
                    remote_path = remote_path.replace('\', '/') # Convert to unix style

                    if not ftp_path_tools.ftp_exists(remote_path):
                        ftp_path_tools.ftp_mkdirs(remote_path)

                    # Change to directory
                    try:
                        ftp_h.cwd(remote_path)
                        continue_on = True
                    except ftplib.error_perm, e:
                        print 'ERROR -- %s' % (str(e.args))
                    except psftplib.PsFtpInvalidCommand, e:
                        print 'ERROR -- %s' % (str(e.args))                        

                    if continue_on:
                        if os.path.exists(filepath):
                            f_h = open(filepath,'rb')
                            filename = os.path.split(f_h.name)[-1]

                            display_filename = os.path.join(remote_sub_path, filename)
                            display_filename = display_filename.replace('\', '/')

                            print 'Sending (%s) ...' % (display_filename),
                            send_cmd = 'STOR %s' % (filename)
                            try:
                                ftp_h.storbinary(send_cmd, f_h)
                                f_h.close()
                                print 'Done!' 
                            except Exception, e:
                                print 'ERROR!'
                                print str(e.args)
                                print
                        else:
                            print "WARNING -- File no longer exists, (%s)!" % (filepath)

                ftp_h.quit()
                print 'Closing Connection'
    else:
        print 'ERROR -- No files found in (%s)' % (base_local_dir)

    return continue_on


if __name__ == '__main__':
    import optparse

    default_config_file = u'ftpallcfg.py'

    # Create parser, and configure command line options to parse
    parser = optparse.OptionParser()
    parser.add_option("-l", "--local_dir",
                      dest="local_dir",
                      help="Local Directory (Defaults to CWD)",
                      default='.')
    parser.add_option("-r", "--remote_dir",
                      dest="remote_dir",
                      help="[REQUIRED] Target Remote directory",
                      default=None)
    parser.add_option("-u", "--username",
                      dest="username",
                      help="[REQUIRED] username",
                      default=None)
    parser.add_option("-s","--server",
                      dest="server",
                      help="[REQUIRED] Server Address",
                      default=None)
    parser.add_option("-e", "--encrypt",
                      action="store_true", 
                      dest="encrypt",
                      help="Use sftp",
                      default=False)
    parser.add_option("-m", 
                      action="store_true", 
                      dest="monitor",
                      help="Keep process open and monitor changes",
                      default=False)
    parser.add_option("-w", 
                      action="store_true", 
                      dest="walkdir",
                      help="Walk sub directories of the given directory to find files to send.",
                      default=False)      


    (options,args) = parser.parse_args()

    if (options.username and options.server and options.remote_dir) or 
        os.path.exists(default_config_file):
        local_dir = options.local_dir

        if os.path.exists(default_config_file):
            sys.path.append('.')
            import ftpallcfg
            try:
                server = ftpallcfg.server
                username = ftpallcfg.username
                remote_dir = ftpallcfg.remote_dir
                encrypt = ftpallcfg.encrypt
                monitor = ftpallcfg.monitor
                walk = ftpallcfg.walk
            except AttributeError, e:
                print "ERROR --", str(e.args)
                print
                print 'Value(s) missing in %s file!  The following values MUST be included:' % (default_config_file)
                print '================================'
                print 'server = <server to ftp to>'
                print 'username = <Username for access to given server>'
                print 'remote_dir = <remote server directory>'
                print 'encrypt= True/False'
                print 'monitor = True/False'
                print 'walk == True/False'
                print '================================' 
                sys.exit()
        else:
            server = options.server
            username = options.username
            remote_dir = options.remote_dir
            encrypt = options.encrypt
            monitor = options.monitor
            walk = options.walkdir

        # get the user password
        prompt = 'Password (%s@%s): ' % (username, server)

        if os.isatty(sys.stdin.fileno()):
            p = getpass.getpass(prompt)
        else:
            #p = sys.stdin.readline().rstrip()
            p = raw_input(prompt).rstrip()


        if options.encrypt:
            print '>> Using sftp for secure transfers <<'
            print 

        if monitor:
            try:
                monitor_and_ftp(server,username,p,local_dir, remote_dir, encrypt, walk)
            except KeyboardInterrupt:
                print 'Exiting...'
        else:  
            try:
                upload_all(server, username, p, local_dir, remote_dir, [], encrypt, walk)
            except KeyboardInterrupt:
                print 'Exiting...'            

    else:
        print 'ERROR -- Required option not given!'
        print __revision__
        print __doc__
        print
        parser.print_help()

這篇關于使用 Python 腳本將文件夾從本地系統上傳到 FTP的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Why I cannot make an insert to Python list?(為什么我不能插入 Python 列表?)
Insert a column at the beginning (leftmost end) of a DataFrame(在 DataFrame 的開頭(最左端)插入一列)
Python psycopg2 not inserting into postgresql table(Python psycopg2 沒有插入到 postgresql 表中)
list extend() to index, inserting list elements not only to the end(list extend() 索引,不僅將列表元素插入到末尾)
How to add element in Python to the end of list using list.insert?(如何使用 list.insert 將 Python 中的元素添加到列表末尾?)
TypeError: #39;float#39; object is not subscriptable(TypeError:“浮動對象不可下標)
主站蜘蛛池模板: 刘秘书_你身边专业的工作范文写作小秘书 | 引领中高档酒店加盟_含舍·美素酒店品牌官网| 上海阳光泵业制造有限公司 -【官方网站】 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 乐考网-银行从业_基金从业资格考试_初级/中级会计报名时间_中级经济师 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 分光色差仪,测色仪,反透射灯箱,爱色丽分光光度仪,美能达色差仪维修_苏州欣美和仪器有限公司 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 外贸网站建设-外贸网站设计制作开发公司-外贸独立站建设【企术】 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 移动机器人产业联盟官网| 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 早报网| SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 上海道勤塑化有限公司| 广州食堂承包_广州团餐配送_广州堂食餐饮服务公司 - 旺记餐饮 | 铁素体测量仪/检测仪/铁素体含量测试仪-苏州圣光仪器有限公司 | 洗石机-移动滚筒式,振动,螺旋,洗矿机-青州冠诚重工机械有限公司 | 深圳公司注册-工商注册公司-千百顺代理记账公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 深圳离婚律师咨询「在线免费」华荣深圳婚姻律师事务所专办离婚纠纷案件 | 粘弹体防腐胶带,聚丙烯防腐胶带-全民塑胶 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 低浓度恒温恒湿称量系统,强光光照培养箱-上海三腾仪器有限公司 | 中细软知识产权_专业知识产权解决方案提供商| 定制/定做衬衫厂家/公司-衬衫订做/订制价格/费用-北京圣达信 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 深圳活动策划公司|庆典策划|专业公关活动策划|深圳艺典文化传媒 重庆中专|职高|技校招生-重庆中专招生网 | ★塑料拖链__工程拖链__电缆拖链__钢制拖链 - 【上海闵彬】 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 浙江皓格药业有限公司| 电主轴,车床电磨头,变频制动电机-博山鸿达特种电机 | 茶叶百科网-茶叶知识与茶文化探讨分享平台 | 电解抛光加工_不锈钢电解抛光_常州安谱金属制品有限公司 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 |