一、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
微信掃一掃
支付寶掃一掃