Python實現(xiàn)下載監(jiān)控工具類:自動檢測并移動下載文件
背景介紹
在日常開發(fā)和自動化任務中,經(jīng)常需要處理文件下載的場景。無論是網(wǎng)頁自動化測試、爬蟲抓取數(shù)據(jù),還是自動備份文件,都需要一個可靠的方式來監(jiān)控下載目錄,并在文件下載完成后進行后續(xù)處理。本文介紹一個實用的Python下載監(jiān)控工具類,能夠自動檢測新下載的文件并將其移動到指定位置。
工具功能
這個Downloader類提供以下核心功能:
- 監(jiān)控下載目錄:實時檢測指定目錄中新出現(xiàn)的文件
- 忽略臨時文件:自動過濾瀏覽器下載過程中的臨時文件(如.crdownload, .tmp)
- 文件移動與備份:將下載完成的文件移動到目標位置,支持備份或覆蓋現(xiàn)有文件
- 超時控制:設置合理的等待時間,避免無限期阻塞
核心代碼解析
初始化配置
class Downloader():
def __init__(self, download_dir, time_out=60, poll_frequency=0.5,
exist_del=True, ignore_suffix_list=None):
# 下載目錄
self.download_dir = download_dir
self.time_out = time_out # 超時時間(秒)
self.poll_frequency = poll_frequency # 輪詢間隔(秒)
self.exist_del = exist_del # 目標文件存在時是否刪除
# 忽略的臨時文件后綴
self.ignore_suffix_list = ignore_suffix_list or [".crdownload", ".tmp"]
監(jiān)控啟動方法
def watch_start(self):
"""記錄下載前的文件狀態(tài)"""
path = Path(self.download_dir)
files = set(path.glob("*"))
self.path = path
self.origin_files = files
文件檢測方法
def get_download_file(self):
"""檢測新下載的文件"""
start_time = perf_counter()
while (perf_counter() - start_time <= self.time_out):
now_files = set(self.path.glob("*"))
# 計算新增文件
diff_list = list(now_files.difference(self.origin_files))
if not diff_list:
sleep(self.poll_frequency)
continue
# 過濾臨時文件
final_diff_list = []
for item in diff_list:
if Path(item).suffix not in self.ignore_suffix_list:
final_diff_list.append(item)
# 處理有效文件
if final_diff_list:
if len(final_diff_list) > 1:
raise Exception("暫不支持監(jiān)控多個文件下載")
return str(Path(final_diff_list[0]).resolve())
return None文件移動方法
def download_file(self, file_path):
"""移動下載的文件到指定位置"""
download_file = self.get_download_file()
if download_file is None:
raise Exception("下載超時,未獲取到文件")
log.info(f"找到文件 {download_file}, 開始移動")
target = Path(file_path)
# 處理目標文件已存在的情況
if target.exists():
if self.exist_del:
target.unlink() # 刪除現(xiàn)有文件
else:
# 創(chuàng)建帶時間戳的備份文件
suffix = target.suffix
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
backup_path = target.with_name(
f"{target.stem}_{timestamp}_bak{suffix}"
)
shutil.move(file_path, backup_path)
# 移動文件到目標位置
shutil.move(download_file, file_path)使用示例
if __name__ == "__main__":
log.basicConfig(level=log.INFO)
# 初始化下載監(jiān)控器
downloader = Downloader(
download_dir=r"C:\Users\user\Downloads", # 監(jiān)控的下載目錄
time_out=120, # 超時時間2分鐘
poll_frequency=0.2, # 每0.2秒檢查一次
exist_del=False # 目標文件存在時創(chuàng)建備份
)
# 開始監(jiān)控
downloader.watch_start()
# 這里應該觸發(fā)下載操作(例如:點擊下載鏈接)
# 示例:使用Selenium下載文件
# driver.find_element(By.ID, "downloadButton").click()
try:
# 獲取并移動下載的文件
downloader.download_file(r"D:\project\data\report.xlsx")
log.info("文件下載并移動成功!")
except Exception as e:
log.error(f"下載失敗: {str(e)}")總結
本文介紹的下載監(jiān)控工具提供了一個簡單而強大的解決方案,用于自動化處理文件下載任務。通過合理設置超時時間、輪詢頻率和臨時文件過濾規(guī)則,可以適應各種下載場景。工具的核心思路是通過比較目錄快照的變化來檢測新文件,然后進行后續(xù)處理。
這個工具類具有以下優(yōu)勢:
輕量級:不依賴外部庫,標準庫實現(xiàn)
可配置:靈活的參數(shù)設置適應不同需求
健壯性:完善的錯誤處理和超時機制
易集成:可以輕松集成到現(xiàn)有自動化流程中
到此這篇關于Python實現(xiàn)下載監(jiān)控工具類:自動檢測并移動下載文件的文章就介紹到這了,更多相關Python下載監(jiān)控內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
用python簡單實現(xiàn)mysql數(shù)據(jù)同步到ElasticSearch的教程
今天小編就為大家分享一篇用python簡單實現(xiàn)mysql數(shù)據(jù)同步到ElasticSearch的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
python3實現(xiàn)網(wǎng)頁版raspberry pi(樹莓派)小車控制
這篇文章主要為大家詳細介紹了python3實現(xiàn)網(wǎng)頁版raspberry pi(樹莓派)小車控制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02
利用Python如何批量修改數(shù)據(jù)庫執(zhí)行Sql文件
這篇文章主要給大家介紹了關于利用Python如何批量修改數(shù)據(jù)庫執(zhí)行Sql文件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-07-07
Python實現(xiàn)自動收集參數(shù)的技巧分享
在Python中,充分利用函數(shù)參數(shù)的自動收集和靈活處理,是寫出高效且易維護代碼的關鍵之一,本文將深入研究Python函數(shù)參數(shù)的收集方式,感興趣的小伙伴可以了解下2023-12-12
python+mysql實現(xiàn)個人論文管理系統(tǒng)
這篇文章主要為大家詳細介紹了python+mysql實現(xiàn)個人論文管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10

