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

