欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)下載監(jiān)控工具類(lèi):自動(dòng)檢測(cè)并移動(dòng)下載文件

 更新時(shí)間:2025年06月16日 09:14:36   作者:嘆一曲當(dāng)時(shí)只道是尋常  
在日常開(kāi)發(fā)和自動(dòng)化任務(wù)中,經(jīng)常需要處理文件下載的場(chǎng)景,本文介紹一個(gè)實(shí)用的Python下載監(jiān)控工具類(lèi),能夠自動(dòng)檢測(cè)新下載的文件并將其移動(dòng)到指定位置,感興趣的小伙伴可以了解一下

背景介紹

在日常開(kāi)發(fā)和自動(dòng)化任務(wù)中,經(jīng)常需要處理文件下載的場(chǎng)景。無(wú)論是網(wǎng)頁(yè)自動(dòng)化測(cè)試、爬蟲(chóng)抓取數(shù)據(jù),還是自動(dòng)備份文件,都需要一個(gè)可靠的方式來(lái)監(jiān)控下載目錄,并在文件下載完成后進(jìn)行后續(xù)處理。本文介紹一個(gè)實(shí)用的Python下載監(jiān)控工具類(lèi),能夠自動(dòng)檢測(cè)新下載的文件并將其移動(dòng)到指定位置。

工具功能

這個(gè)Downloader類(lèi)提供以下核心功能:

  • 監(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  # 輪詢(xún)間隔(秒)
        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í)間、輪詢(xún)頻率和臨時(shí)文件過(guò)濾規(guī)則,可以適應(yīng)各種下載場(chǎng)景。工具的核心思路是通過(guò)比較目錄快照的變化來(lái)檢測(cè)新文件,然后進(jìn)行后續(xù)處理。

這個(gè)工具類(lèi)具有以下優(yōu)勢(shì):

輕量級(jí):不依賴(lài)外部庫(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)控工具類(lèi):自動(dòng)檢測(cè)并移動(dòng)下載文件的文章就介紹到這了,更多相關(guān)Python下載監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python常見(jiàn)內(nèi)置高階函數(shù)即高階函數(shù)用法

    Python常見(jiàn)內(nèi)置高階函數(shù)即高階函數(shù)用法

    這篇文章主要介紹了Python的三種高階函數(shù)map、filter、reduce,高階函數(shù)就是一個(gè)函數(shù)可以作為參數(shù)傳給另外一個(gè)函數(shù),或者一個(gè)函數(shù)的返回值為另外一個(gè)函數(shù)(若返回值為該函數(shù)本身,則為遞歸),滿(mǎn)足其一則為高階函數(shù),具體內(nèi)容,需要的朋友可以參考下面文章的介紹
    2021-12-12
  • python對(duì)象轉(zhuǎn)字典的兩種實(shí)現(xiàn)方式示例

    python對(duì)象轉(zhuǎn)字典的兩種實(shí)現(xiàn)方式示例

    這篇文章主要介紹了python對(duì)象轉(zhuǎn)字典的兩種實(shí)現(xiàn)方式,結(jié)合實(shí)例形式分析了Python字典與對(duì)象數(shù)據(jù)類(lèi)型轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • Python中Numpy包的安裝與使用方法簡(jiǎn)明教程

    Python中Numpy包的安裝與使用方法簡(jiǎn)明教程

    這篇文章主要介紹了Python中Numpy包的安裝與使用方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Python使用pip命令在線與離線whl包安裝,以及使用numpy打印隨機(jī)數(shù)矩陣的操作技巧,需要的朋友可以參考下
    2018-07-07
  • python語(yǔ)言的優(yōu)勢(shì)是什么

    python語(yǔ)言的優(yōu)勢(shì)是什么

    這篇文章主要介紹了python語(yǔ)言的優(yōu)勢(shì)是什么,從各個(gè)方面做了分析,需要的朋友們可以參考下
    2020-06-06
  • Python日志模塊logging基本用法分析

    Python日志模塊logging基本用法分析

    這篇文章主要介紹了Python日志模塊logging基本用法,結(jié)合實(shí)例形式分析了日志模塊logging的功能、常用函數(shù)、相關(guān)使用技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • 使用pytorch實(shí)現(xiàn)線性回歸

    使用pytorch實(shí)現(xiàn)線性回歸

    這篇文章主要為大家詳細(xì)介紹了使用pytorch實(shí)現(xiàn)線性回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Pycharm運(yùn)行加載文本出現(xiàn)錯(cuò)誤的解決方法

    Pycharm運(yùn)行加載文本出現(xiàn)錯(cuò)誤的解決方法

    今天小編就為大家分享一篇Pycharm運(yùn)行加載文本出現(xiàn)錯(cuò)誤的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python 字典item與iteritems的區(qū)別詳解

    python 字典item與iteritems的區(qū)別詳解

    這篇文章主要介紹了python 字典item與iteritems的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • python如何通過(guò)psutil獲取服務(wù)器cpu、內(nèi)存、磁盤(pán)使用率

    python如何通過(guò)psutil獲取服務(wù)器cpu、內(nèi)存、磁盤(pán)使用率

    這篇文章主要介紹了python通過(guò)psutil獲取服務(wù)器cpu,內(nèi)存,磁盤(pán)使用率,使用psutil,可以很方便地監(jiān)控系統(tǒng)的運(yùn)行狀況,診斷問(wèn)題和優(yōu)化性能,需要的朋友可以參考下
    2023-04-04
  • Python操作列表之List.insert()方法的使用

    Python操作列表之List.insert()方法的使用

    這篇文章主要介紹了Python操作列表之List.insert()方法的使用,是Python入門(mén)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05

最新評(píng)論