㈠ 如何用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也可能不一致。