一、FTP基礎知識
FTP(File Transfer Protocol)是一種傳輸文件的協議,基於客戶機/服務器模式,通過可靠的TCP連接進行數據傳輸。FTP包括兩個部分:FTP服務器和FTP客戶端。FTP服務器是存儲文件的計算機,而FTP客戶端是連接到FTP服務器並下載或上傳文件的計算機。FTP客戶端通過使用FTP命令(例如PUT、GET、LS等)與FTP服務器建立通信。
FTP協議支持兩種傳輸模式:ASCII模式和二進制模式。ASCII模式用於傳輸文本文件,而二進制模式適用於傳輸非文本文件(例如圖像和音頻文件)。除此之外,FTP還支持匿名登錄和加密通訊。
二、FTP功能實現
1. 連接FTP服務器
import ftplib # 連接FTP服務器 ftp = ftplib.FTP() ftp.connect('ftp.example.com', port=21) ftp.login('username', 'password')
在此代碼片段中,我們使用Python內置的ftplib庫連接FTP服務器。connect()命令用於連接服務器,其中’ftp.example.com’是FTP服務器的地址,21是FTP服務器的端口。login()函數用於登錄FTP服務器,其中’username’和’password’是FTP服務器的登錄憑據。
2. 下載文件
# 下載文件 ftp.retrbinary('RETR filename', open('filename', 'wb').write)
在此代碼片段中,我們使用retrbinary()函數從FTP服務器下載文件。’RETR filename’是要下載的文件的名稱,’filename’是要保存的本地文件的名稱。在這個例子中,我們使用Python內置的open()函數打開本地文件,’wb’代表二進制寫模式。
3. 上傳文件
# 上傳文件 with open('filename', 'rb') as file: ftp.storbinary('STOR filename', file)
在此代碼片段中,我們使用storbinary()函數將文件上傳到FTP服務器。’STOR filename’是要上傳的文件的名稱。在這個例子中,我們使用Python內置的open()函數打開要上傳的本地文件,’rb’代表二進制讀模式。然後,我們使用with語句將文件傳遞給storbinary()函數。
4. 刪除文件
# 刪除文件 ftp.delete('filename')
在此代碼片段中,我們使用delete()函數從FTP服務器上刪除文件。’filename’是要刪除的文件的名稱。
三、FTP功能應用
1. 批量下載文件
假設我們需要從FTP服務器上下載多個文件,我們可以編寫一個Python腳本批量下載這些文件。
import ftplib # 連接FTP服務器 ftp = ftplib.FTP() ftp.connect('ftp.example.com', port=21) ftp.login('username', 'password') # 下載多個文件 files = ['file1.txt', 'file2.txt', 'file3.txt'] for file in files: ftp.retrbinary('RETR ' + file, open(file, 'wb').write) # 關閉FTP連接 ftp.quit()
2. 自動化備份數據
我們可以編寫一個Python腳本來自動備份FTP服務器上的數據。以下代碼演示了如何備份FTP服務器上的文件並將其保存到本地文件夾中。
import ftplib import datetime # 連接FTP服務器 ftp = ftplib.FTP() ftp.connect('ftp.example.com', port=21) ftp.login('username', 'password') # 文件備份 remote_directory = 'data/' local_directory = 'backup/folder/' files = ftp.nlst(remote_directory) for file in files: with open(local_directory + file, 'wb') as f: ftp.retrbinary('RETR ' + remote_directory + file, f.write) # 關閉FTP連接 ftp.quit() # 文件壓縮 import zipfile file_name = 'backup-' + str(datetime.datetime.now().strftime('%Y-%m-%d')) + '.zip' with zipfile.ZipFile(file_name, mode='w') as backup: for foldername, subfolders, filenames in os.walk('backup'): for filename in filenames: backup.write(os.path.join(foldername, filename)) # 刪除未壓縮文件 shutil.rmtree('backup/folder/')
在此代碼片段中,我們使用Python內置的datetime、os、shutil和zipfile庫備份FTP服務器上的數據。首先,我們連接到FTP服務器,並使用nlst()函數獲取需要備份的文件列表。然後,我們使用retrbinary()函數將每個文件下載到本地文件夾中。一旦備份完成,我們使用zipfile.ZipFile()創建一個壓縮文件,將備份文件添加到其中。最後,我們刪除未壓縮的備份文件夾。
3. 監控FTP服務器上的文件變化
我們可以使用Python的watchdog庫監控FTP服務器上的文件變化。在以下代碼中,我們使用FTP連接對象和watchdog庫的Observer類實現文件監控。
import ftplib import os import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class FTPMonitor(FileSystemEventHandler): def __init__(self, ftp): super().__init__() self.ftp = ftp def on_created(self, event): if event.is_directory: return None local_path = event.src_path remote_path = 'data/' + os.path.basename(event.src_path) with open(local_path, 'rb') as f: self.ftp.storbinary('STOR ' + remote_path, f) def on_modified(self, event): self.on_created(event) if __name__ == '__main__': # 連接FTP服務器 ftp = ftplib.FTP() ftp.connect('ftp.example.com', port=21) ftp.login('username', 'password') # 監控FTP服務器文件變化 folder_to_track = 'watch_folder' observer = Observer() event_handler = FTPMonitor(ftp) observer.schedule(event_handler, folder_to_track, recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() # 關閉FTP連接 ftp.quit()
四、小結
FTP是一種廣泛使用的文件傳輸協議,可幫助開發人員更輕鬆地傳輸文件。Python內置的ftplib庫可用於連接FTP服務器並執行各種文件傳輸操作,例如下載、上傳和刪除文件。此外,Python還有許多其他庫可用於FTP功能,包括datetime、os、shutil和watchdog。
原創文章,作者:TGZHZ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/372450.html