python上传本地文件到ftp_用python写测试脚本,从本地传文件至ftp远程路径

展开全部

本文实例讲述了python实现支持目录FTP上传下载文件的方法。分享给大家供大家参考。具体如下:

该程32313133353236313431303231363533e58685e5aeb931333337623466序支持ftp上传下载文件和目录、适用于windows和linux平台。#!/usr/bin/env python

# -*- coding: utf-8 -*-

import ftplib

import os

import sys

class FTPSync(object):

conn = ftplib.FTP()

def __init__(self,host,port=21):

self.conn.connect(host,port)

def login(self,username,password):

self.conn.login(username,password)

self.conn.set_pasv(False)

print self.conn.welcome

def test(self,ftp_path):

print ftp_path

print self._is_ftp_dir(ftp_path)

#print self.conn.nlst(ftp_path)

#self.conn.retrlines( 'LIST ./a/b')

#ftp_parent_path = os.path.dirname(ftp_path)

#ftp_dir_name = os.path.basename(ftp_path)

#print ftp_parent_path

#print ftp_dir_name

def _is_ftp_file(self,ftp_path):

try:

if ftp_path in self.conn.nlst(os.path.dirname(ftp_path)):

return True

else:

return False

except ftplib.error_perm,e:

return False

def _ftp_list(self, line):

list = line.split(' ')

if self.ftp_dir_name==list[-1] and list[0].startswith('d'):

self._is_dir = True

def _is_ftp_dir(self,ftp_path):

ftp_path = ftp_path.rstrip('/')

ftp_parent_path = os.path.dirname(ftp_path)

self.ftp_dir_name = os.path.basename(ftp_path)

self._is_dir = False

if ftp_path == '.' or ftp_path== './' or ftp_path=='':

self._is_dir = True

else:

#this ues callback function ,that will change _is_dir value

try:

self.conn.retrlines('LIST %s' %ftp_parent_path,self._ftp_list)

except ftplib.error_perm,e:

return self._is_dir

return self._is_dir

def get_file(self,ftp_path,local_path='.'):

ftp_path = ftp_path.rstrip('/')

if self._is_ftp_file(ftp_path):

file_name = os.path.basename(ftp_path)

#如果本地路径是目录,下载文件到该目录

if os.path.isdir(local_path):

file_handler = open(os.path.join(local_path,file_name), 'wb' )

self.conn.retrbinary("RETR %s" %(ftp_path), file_handler.write)

file_handler.close()

#如果本地路径不是目录,但上层目录存在,则按照本地路径的文件名作为下载的文件名称

elif os.path.isdir(os.path.dirname(local_path)):

file_handler = open(local_path, 'wb' )

self.conn.retrbinary("RETR %s" %(ftp_path), file_handler.write)

file_handler.close()

#如果本地路径不是目录,且上层目录不存在,则退出

else:

print 'EROOR:The dir:%s is not exist' %os.path.dirname(local_path)

else:

print 'EROOR:The ftp file:%s is not exist' %ftp_path

def put_file(self,local_path,ftp_path='.'):

ftp_path = ftp_path.rstrip('/')

if os.path.isfile( local_path ):

file_handler = open(local_path, "r")

local_file_name = os.path.basename(local_path)

#如果远程路径是个目录,则上传文件到这个目录,文件名不变

if self._is_ftp_dir(ftp_path):

self.conn.storbinary('STOR %s'%os.path.join(ftp_path,local_file_name), file_handler)

#如果远程路径的上层是个目录,则上传文件,文件名按照给定命名

elif self._is_ftp_dir(os.path.dirname(ftp_path)):

print 'STOR %s'%ftp_path

self.conn.storbinary('STOR %s'%ftp_path, file_handler)

#如果远程路径不是目录,且上一层的目录也不存在,则提示给定远程路径错误

else:

print 'EROOR:The ftp path:%s is error' %ftp_path

file_handler.close()

else:

print 'ERROR:The file:%s is not exist' %local_path

def get_dir(self,ftp_path,local_path='.',begin=True):

ftp_path = ftp_path.rstrip('/')

#当ftp目录存在时下载

if self._is_ftp_dir(ftp_path):

#如果下载到本地当前目录下,并创建目录

#下载初始化:如果给定的本地路径不存在需要创建,同时将ftp的目录存放在给定的本地目录下。

#ftp目录下文件存放的路径为local_path=local_path+os.path.basename(ftp_path)

#例如:将ftp文件夹a下载到本地的a/b目录下,则ftp的a目录下的文件将下载到本地的a/b/a目录下

if begin:

if not os.path.isdir(local_path):

os.makedirs(local_path)

local_path=os.path.join(local_path,os.path.basename(ftp_path))

#如果本地目录不存在,则创建目录

if not os.path.isdir(local_path):

os.makedirs(local_path)

#进入ftp目录,开始递归查询

self.conn.cwd(ftp_path)

ftp_files = self.conn.nlst()

for file in ftp_files:

local_file = os.path.join(local_path, file)

#如果file ftp路径是目录则递归上传目录(不需要再进行初始化begin的标志修改为False)

#如果file ftp路径是文件则直接上传文件

if self._is_ftp_dir(file):

self.get_dir(file,local_file,False)

else:

self.get_file(file,local_file)

#如果当前ftp目录文件已经遍历完毕返回上一层目录

self.conn.cwd( ".." )

return

else:

print 'ERROR:The dir:%s is not exist' %ftp_path

return

def put_dir(self,local_path,ftp_path='.',begin=True):

ftp_path = ftp_path.rstrip('/')

#当本地目录存在时上传

if os.path.isdir(local_path):

#上传初始化:如果给定的ftp路径不存在需要创建,同时将本地的目录存放在给定的ftp目录下。

#本地目录下文件存放的路径为ftp_path=ftp_path+os.path.basename(local_path)

#例如:将本地文件夹a上传到ftp的a/b目录下,则本地a目录下的文件将上传的ftp的a/b/a目录下

if begin:

if not self._is_ftp_dir(ftp_path):

self.conn.mkd(ftp_path)

ftp_path=os.path.join(ftp_path,os.path.basename(local_path))

#如果ftp路径不是目录,则创建目录

if not self._is_ftp_dir(ftp_path):

self.conn.mkd(ftp_path)

#进入本地目录,开始递归查询

os.chdir(local_path)

local_files = os.listdir('.')

for file in local_files:

#如果file本地路径是目录则递归上传目录(不需要再进行初始化begin的标志修改为False)

#如果file本地路径是文件则直接上传文件

if os.path.isdir(file):

ftp_path=os.path.join(ftp_path,file)

self.put_dir(file,ftp_path,False)

else:

self.put_file(file,ftp_path)

#如果当前本地目录文件已经遍历完毕返回上一层目录

os.chdir( ".." )

else:

print 'ERROR:The dir:%s is not exist' %local_path

return

if __name__ == '__main__':

ftp = FTPSync('192.168.1.110')

ftp.login('test','test')

#上传文件,不重命名

#ftp.put_file('111.txt','a/b')

#上传文件,重命名

#ftp.put_file('111.txt','a/112.txt')

#下载文件,不重命名

#ftp.get_file('/a/111.txt',r'D:\\')

#下载文件,重命名

#ftp.get_file('/a/111.txt',r'D:\112.txt')

#下载到已经存在的文件夹

#ftp.get_dir('a/b/c',r'D:\\a')

#下载到不存在的文件夹

#ftp.get_dir('a/b/c',r'D:\\aa')

#上传到已经存在的文件夹

ftp.put_dir('b','a')

#上传到不存在的文件夹

ftp.put_dir('b','aa/B/')

希望本文所述对大家的Python程序设计有所帮助。

Python中的ftplib模块

Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件

FTP的工作流程及基本操作可参考协议RFC959

ftp登陆连接

from ftplib import FTP #加载ftp模块

ftp=FTP() #设置变量

ftp.set_debuglevel(2) #打开调试级别2,显示详细信息

ftp.connect("IP","port") #连接的ftp sever和端口

ftp.login("user","password")#连接的用户名,密码

print ftp.getwelcome() #打印出欢迎信息

ftp.cmd("xxx/xxx") #更改远程目录

bufsize=1024 #设置的缓冲区大小

filename="filename.txt" #需要下载的文件

file_handle=open(filename,"wb").write #以写模式在本地打开文件

ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件

ftp.set_debuglevel(0) #关闭调试模式

ftp.quit #退出ftp

ftp相关命令操作

ftp.cwd(pathname) #设置FTP当前操作的路径

ftp.dir() #显示目录下文件信息

ftp.nlst() #获取目录下的文件

ftp.mkd(pathname) #新建远程目录

ftp.pwd() #返回当前所在位置

ftp.rmd(dirname) #删除远程目录

ftp.delete(filename) #删除远程文件

ftp.rename(fromname, toname)#将fromname修改名称为toname。

ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件

ftp.retrbinary("RETR filename.txt",file_handel,bufsize)#下载FTP文件

网上找到一个具体的例子:# 例:FTP编程

from ftplib import FTP

ftp = FTP()

timeout = 30

port = 21

ftp.connect('192.168.1.188',port,timeout) # 连接FTP服务器

ftp.login('UserName','888888') # 登录

print ftp.getwelcome()  # 获得欢迎信息

ftp.cwd('file/test')    # 设置FTP路径

list = ftp.nlst()       # 获得目录列表

for name in list:

print(name)             # 打印文件名字

path = 'd:/data/' + name    # 文件保存路径

f = open(path,'wb')         # 打开要保存文件

filename = 'RETR ' + name   # 保存FTP文件

ftp.retrbinary(filename,f.write) # 保存FTP上的文件

ftp.delete(name)            # 删除FTP文件

ftp.storbinary('STOR '+filename, open(path, 'rb')) # 上传FTP文件

ftp.quit()                  # 退出FTP服务器

完整的模板:#!/usr/bin/python

# -*- coding: utf-8 -*-

import ftplib

import os

import socket

HOST = 'ftp.mozilla.org'

DIRN = 'pub/mozilla.org/webtools'

FILE = 'bugzilla-3.6.7.tar.gz'

def main():

try:

f = ftplib.FTP(HOST)

except (socket.error, socket.gaierror):

print 'ERROR:cannot reach " %s"' % HOST

return

print '***Connected to host "%s"' % HOST

try:

f.login()

except ftplib.error_perm:

print 'ERROR: cannot login anonymously'

f.quit()

return

print '*** Logged in as "anonymously"'

try:

f.cwd(DIRN)

except ftplib.error_perm:

print 'ERRORL cannot CD to "%s"' % DIRN

f.quit()

return

print '*** Changed to "%s" folder' % DIRN

try:

#传一个回调函数给retrbinary() 它在每接收一个二进制数据时都会被调用

f.retrbinary('RETR %s' % FILE, open(FILE, 'wb').write)

except ftplib.error_perm:

print 'ERROR: cannot read file "%s"' % FILE

os.unlink(FILE)

else:

print '*** Downloaded "%s" to CWD' % FILE

f.quit()

return

if __name__ == '__main__':

main()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 和 Linux 之间文件,可以使用以下几种方法: 1. 使用 FTP:可以在 Windows 上安装一个 FTP 服务器,然后在 Linux 上使用 FTP 客户端连接到 Windows 服务器,然后文件。 2. 使用 SCP:SCP 是 Secure Copy 的缩,是基于 SSH 协议的一种安全的文件输协议。可以在 Linux 终端中使用 scp 命令将文件从 Windows 输到 Linux。 3. 使用 Samba 共享:Samba 是一种允许 Linux 和 Windows 系统之间共享文件的协议。可以在 Windows 上安装 Samba 服务器,然后在 Linux 上挂载 Windows 共享,然后文件。 以下是使用 SCP 在 Windows 和 Linux 之间文件的具体步骤: 1. 在 Windows 上安装一个 SSH 客户端,比如 PuTTY。 2. 在 Linux 上使用 SCP 命令将文件从 Windows 输到 Linux。假设 Windows IP 地址为 192.168.1.100,要输的文件为 file.txt,Linux 用户名为 user,Linux IP 地址为 192.168.1.200,输命令如下: ``` scp user@192.168.1.100:/path/to/file.txt /path/to/destination/folder/ ``` 其中,/path/to/file.txt 是 Windows 上的文件路径,/path/to/destination/folder/ 是 Linux 上的目标文件路径。scp 命令会提示输入 Windows 用户名和密码。 3. 如果要将文件从 Linux 输到 Windows,可以在 Windows 上安装一个 SCP 服务器,比如 WinSCP,然后在 Linux 上使用 SCP 命令将文件输到 Windows。假设 Windows 用户名为 user,密码为 password,Windows IP 地址为 192.168.1.100,要输的文件为 file.txt,Linux 用户名为 user,Linux IP 地址为 192.168.1.200,输命令如下: ``` scp /path/to/file.txt user@192.168.1.100:/path/to/destination/folder/ -P 22 ``` 其中,/path/to/file.txt 是 Linux 上的文件路径,/path/to/destination/folder/ 是 Windows 上的目标文件路径,-P 22 指定 SSH 端口为 22。scp 命令会提示输入 Windows 用户名和密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值