FTP上传下载
相关函数:
from ftplib import FTP #加载ftp模块
ftp=FTP() #设置变量
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect("IP","port") #连接的ftp sever和端口
ftp.login("user","password") #连接的用户名,密码
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文件
一个示例:
from ftplib import FTP
import os
import sys
import configparser
def downloadfile(downftp, remotepath,localpath):
bufsize=1024
fp = open(localpath,'wb') 如果localpath是一个文件名,那么即使不存在也会自己创建,但是如果包含目录,要保证对应的目录一定存在
downftp.set_debuglevel(2)
downftp.retrbinary('RETR ' + remotepath, fp.write, bufsize)
fp.close() //下载完毕关闭文件句柄
def ftpconnect(host,username,password):
ftp = FTP()
ftp.connect(host, 2012)
ftp.login(username, password)
return ftp
def uploadfile(ftp,remotepath, localpath):
bufsize=1024
fp=open(localpath,'rb') //打开本地的文件读
ftp.set_debuglevel(0)
ftp.storbinary('STOR ' + remotepath, fp, bufsize)
fp.close()
def testDownUp():
print("下载开始")
downftp=ftpconnect(ip, username,password) //ftp的ip,用户名,密码,根据实际填入
downopsition = realfilename //realfilename自定义,这一步可以直接对下载下来的文件进行重命名
downloadfile(downftp,remotedir,downopsition) //remotedir是远程ftp你所需要下载文件所在的文件目录
downftp.quit() //下载完毕需要关闭ftp
print("下载结束")
print("上传开始")
ftp = ftpconnect(_ip, _username, _password) //若上传的ftp地址和下载不是同一个,则需要重新建立连接
uploadfile(ftp, remotedir, localpath) //remotedir是目标ftp要上传的目录,localpath是要上传文件所在的目录,要具体到文件名
ftp.quit()
print("上传完毕")
testDownUp()
socket编程
用python实现简单的客户端服务器通信,某些情况下只是简单需求,搭建Nginx或者Apache有点没必要,所以自己实现一个简单的单线程的server和client,client发送server需要的参数,server接收后进行某些操作,并且返回给客户端结果
server.py
#!/usr/bin/python
#encoding:utf-8
import socket
import subprocess
import sys
import json
#开启ip和端口
ip_port = ('127.0.0.1',9999)
#生成一个句柄
sk = socket.socket()
#绑定ip端口
sk.bind(ip_port)
#最多连接数
sk.listen(5)
#开启死循环
while True:
print ('server waiting...')
#等待链接,阻塞,直到渠道链接 conn打开一个新的对象 专门给当前链接的客户端 addr是ip地址
conn,addr = sk.accept()
#获取客户端请求数据
client_data = conn.recv(1024)
#打印客户端的数据
print (str(client_data,'utf8'))
#解析收到的json数据
if(len(client_data) != 0):
try:
#解析json数据
json_data = json.loads(client_data)
one = json_data['para1']
two = json_data['para2']
#调用某些你准备好要进行的操作,将需要的解析后的参数穿进去
result=somefunction(one, two)
if result == 1:
conn.sendall(bytes('fail,具体的原因','utf8'))
if result == 2:
conn.sendall(bytes('fail,具体的原因','utf8'))
if result == 3:
conn.sendall(bytes('fail,具体的原因','utf8'))
if result == 0:
conn.sendall(bytes('Success','utf8'))
# subprocess.run([sys.executable,"cydown.py", file_name, tcp_name, post_fix])
except KeyError:
conn.sendall(bytes('Fail!检查后重试','utf8'))
finally:
conn.close()
client.py
#!/usr/bin/python
#encoding:utf-8
import socket
import json
import sys
import select
import configparser
#从命令行接收参数
lenargs=len(sys.argv)
if lenargs < 3:
print('参数数量错误')
sys.exit()
para1=sys.argv[1]
para2=sys.argv[2]
#要连接的ip和端口走配置,如果有变化会比较方便
cf = configparser.ConfigParser()
cf.read("client_conf.conf")
ip = cf.get("link", "ip")
port = cf.getint("link", "port")
#链接服务端ip和端口
ip_port = (ip, port)
#生成一个句柄
sk = socket.socket()
#请求连接服务端
sk.connect(ip_port)
#发送json数据
jsondata = {'para1':para1, 'para2':para2}
json_str = json.dumps(jsondata)
sk.sendall(bytes(json_str,'utf8'))
while True:
if not sk:
break;
rs,_,_ = select.select([sk],[],[],10)
for r in rs:
#接受数据
server_reply = r.recv(1024)
if not server_reply:
break
#打印接受的数据(server给的反馈)
print (str(server_reply,'utf8'))
#关闭连接
sk.close()
这里读配置用了python自带的configparser,使用起来非常方便,可参考https://www.cnblogs.com/feeland/p/4514771.html