python网络编程之ftplib(文件传输)
·
(1)ftplib介绍
python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件。
FTP的工作流程及基本操作可参考协议RFC959。
安装
pip install pyftplib
(2)手动登录ftp服务器
需要的信息:ftp服务器地址,用户名,密码
打开【此电脑】,在上方输入框输入【ftp:hk801.pc51.com】,进入指定的ftp服务器的登录界面

(3)基本函数接口
ftp = FTP() # FTP对象
ftp.set_debuglevel(2) # 打开调试级别2,显示详细信息
ftp.connect("你的IP", "port") # 连接的ftp sever和端口
ftp.login("user", "password") # 连接的用户名,密码
ftp.getwelcome() # 返回欢迎信息
ftp.cmd("xxx/xxx") # 进入远程目录
bufsize = 1024 # 设置的缓冲区大小
filename = "filename.txt" # 需要下载的文件
file_handle = open(filename, "wb").write # 以写模式在本地打开文件
ftp.retrbinaly("RETR %s"%filename, file_handle, bufsize) # 接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) # 关闭调试模式
ftp.quit() # 退出ftp
# ftp相关命令操作
ftp.cwd(pathname) # 设置FTP当前操作的路径
ftp.dir() # 显示目录下所有目录信息,函数返回空
ftp.nlst() # 函数以列表形式返回目录下的所有目录名和文件名
ftp.mkd(pathname) # 新建远程目录
# 创建已存在的文件会报错
# 而且不能创建深度目录,比如目录 /yyyy/kkkk不能直接创建
# 只能先创建 /yyyy,再创建/yyyy/kkkk
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文件
(4)用法示例
# -*- coding: utf-8 -*-
from ftplib import FTP
class LinkFTP:
"""
连接 FTP 服务器
"""
def __init__(self, host: str, port: int, username: str, password: str):
ftp_ = FTP()
# 连接
ftp_.connect(host, port)
# 登录
ftp_.login(username, password)
print(ftp_.getwelcome())
self.ftp = ftp_
self.buffer_size = 2048
def download_file(self, remote_path: str, local_path: str) -> None:
"""
从 ftp 下载文件
:param remote_path: 远程服务器的目录绝对路径
:param local_path:
:return:
"""
with open(local_path, 'wb') as fp:
self.ftp.retrbinary('RETR ' + remote_path, fp.write, self.buffer_size)
self.ftp.set_debuglevel(0)
def upload_file(self, remote_path: str, local_path: str) -> None:
"""
从本地上传文件到 ftp
:param remote_path: 远程服务器的文件名绝对路径
:param local_path: 本地的文件名绝对路径
:return:
"""
with open(local_path, 'rb') as fp:
self.ftp.storbinary('STOR ' + remote_path, fp, self.buffer_size)
self.ftp.set_debuglevel(0)
def path_list(self, path: str) -> list:
"""
获取路径信息
:param path: 路径
:return:
"""
# 获取 ftp
ftp = self.ftp
# 切换路径
ftp.cwd(path)
# 显示目录下所有目录信息
ftp.dir()
# 获取目录下的文件夹
dir_list: list = ftp.nlst()
# 排序
dir_list.sort()
return dir_list
if __name__ == "__main__":
ip = "111.122.228.21"
port = 19
username = "xxxxx"
password = "yyyyy"
win10ftp = LinkFTP(ip, port, username, password)
(5)问题记录
1.550 Permission denied错误
ftplib上传文件出现ftplib.error_perm: 550 Permission denied错误
错误

解决办法:
修改配置文件:sudo gedit /etc/vsftpd.conf
去掉“write_enable=YES”前面的#
重启vsftp服务器:sudo service vsftpd restart
或者这样修改权限,将对应用户的文件写入和修改权限加上


end
更多推荐
所有评论(0)