㈠ 如何用python将ftp文件进行下载并上传到服务器指定目
Python通过ftplib库与FTP服务器进行交互,实现文件下载与上传。具体步骤如下:
1. 首先,导入ftplib库,创建FTP对象并登录FTP服务器。
2. 使用`retrbinary()`方法下载FTP文件。传递文件名和一个回调函数,该函数接收文件内容并将其存储。
3. 使用`storbinary()`方法上传文件到FTP服务器。传递文件名、一个打开的文件对象和一个回调函数,该函数接收服务器的应答。
4. 通过`quit()`或`close()`方法关闭FTP连接。
使用ftplib进行FTP操作适用于标准FTP服务,但存在安全性问题。
与之相比,SFTP(SSH文件传输协议)提供更安全的文件传输。Python通过paramiko库支持SFTP。
1. 首先,确保已经安装了paramiko库。若未安装,使用pip命令安装。
2. 使用`Transport`类建立SSH连接。
3. 创建`SFTPClient`对象,通过SSH连接进行文件操作。
4. 使用`SFTPClient`对象的`get()`方法下载SFTP文件,或`put()`方法上传文件。
5. 结束SFTP会话,关闭SSH连接。
SFTP提供加密传输,相较于标准FTP更安全。
总结,ftplib用于基本的FTP操作,适合非加密环境;而paramiko库支持安全的SFTP协议,适用于需要加密传输的场景。
㈡ 2022/01/17 python ftplib无法连接服务器及解决
一,问题1:
描述:在使用Python/ftplib程序连接FTP服务器时,遇到问题,能够连接主机A/B的FTP服务器并下载数据,但在连接主机B的FTP服务器时,执行dir/nlst/retrbinary等操作时报错“timeout: timed out”。
分析1(A):推测问题可能由网络问题引起。经过网络搜索和参考其他文章,了解到TCP传输过程中存在MTU(Maximum Transmission Unit)上限,超过上限的文件传输会拆成多个包分多次发送,可能导致超时问题。发现路由器MTU设置为1492,调整为1472并重启后,问题解决。
分析1(B):推测问题可能是由程序问题引起,因为FileZilla客户端工作正常。通过谷歌搜索并参考相关文章,了解到设置debug_level=3可以帮助检查问题。发现执行nlst/dir()时返回的是内部IP地址,导致问题发生。分析文章提到这可能是FTP服务器配置错误导致的。解决方法是修改代码以提供处理这种问题的支持,或者找到并修复FTP服务器配置。
二,问题2:
描述:在Jupyter Notebook中使用上述解决方法的代码时,首次运行可以正常执行dir/nlst(),但在第二次运行时,出现了“RecursionError: maximum recursion depth exceeded”的错误。
分析2(A):通过对比winscp的详细输出信息,找到了问题所在,即FTPLIB无法处理FTP服务器返回的错误内部IP。解决方法是自定义FTPLIB的FTP.makepasv()函数,返回正确的外部IP。
分析2(B):问题出现在import库后未正确清除内存中的代码,并重新加载。解决方法是在使用importlib.reload()重新加载库后,问题得到解决。
整体方案:在第一次运行后,通过自定义函数替换原FTPLIB.FTP.makepasv()。第二次运行时,如果在同一个名字空间中多次导入相同模块,会导致无限循环问题。需要确保在不同服务器连接时,即使使用相同的客户端,makepasv()返回的IP也可能不一致。