最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python寫一個基于MD5的文件監(jiān)聽程序

 更新時間:2019年03月11日 10:14:58   作者:木偶Roy  
這篇文章主要給大家介紹了關(guān)于利用Python如何寫一個基于MD5的文件監(jiān)聽程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前述

寫了一個基于MD5算法的文件監(jiān)聽程序,通過不同的文件能夠生成不同的哈希函數(shù),來實現(xiàn)實現(xiàn)判斷文件夾中的文件的增加、修改、刪除和過濾含有特定字符的文件名的文件。

需求說明

需要實現(xiàn)對一個文件夾下的文件的增加、修改和刪除的監(jiān)控, 一旦發(fā)生上述操作,則進行提示。可以選擇過濾掉文件名中的特定字符和只監(jiān)聽文件名中含有特定字符的文件。

簡述

首先,關(guān)于文件的增加、修改、刪除的反饋,可以想到利用MD5等類似的加密算法,因為文件本身可以生成哈希值,只要文件內(nèi)容或者文件名被修改過,就會生成和修改之前的哈希值不同的值,因此可以利用dict來存儲,一個文件名對應(yīng)一個哈希值來存儲。其中增加和刪除就對應(yīng)一個新增加的鍵值對和一個減少的鍵值對,而修改則可以理解為刪除了舊的文件、增加了一個新的文件。

MD5算法可以直接利用第三方的 hashlib 庫來實現(xiàn)

 m = hashlib.md5()
 myFile = open(full_path, 'rb')
 for line in myFile.readlines(): #以行為單位不斷更新哈希值,避免文件過大導致一次產(chǎn)生大量開銷
  m.update(line) #最后可以得到整個文件的哈希值

第二,關(guān)于濾掉文件名中的特定字符和只監(jiān)聽文件名中含有特定字符的文件的功能,這個其實非常簡單,只需要用 list 分別對需要過濾和必須存在字符串進行存儲, 然后利用標志位和字符串的子串包含性進行判斷就可以了,只有滿足條件的文件可以產(chǎn)生哈希值,產(chǎn)生哈希值也就意味著被監(jiān)聽了。

判斷字符串中是否含有字串最常用的方法是 in 和 string 中的 find 方法,這里就不再贅述,可以直接看下面的代碼

第三,因為要同時監(jiān)控多個文件夾,所以必須要利用到線程來處理,創(chuàng)建一個線程池來存儲線程, 線程利用了 threading 庫,并且實現(xiàn)一個線程類來處理線程的操作

class myListener(threading.Thread):
 thread1 = myListener(mydir, json_list_include, json_list_exclude) #生成線程

說明

需要額外說明的一點是,在傳輸需要監(jiān)聽的文件夾、必須包含的字段以及過濾字段的時候,我這里是利用配置文件的形式來存儲的。說到底,是利用 toml 格式的數(shù)據(jù)進行的傳輸,toml格式和 json格式相比,用戶的可讀性更強一些,為了便于博客展示,因此利用了 toml 格式

首先利用代碼生成了一下toml格式的文件,以后再想用的話,程序打包之后,可以直接修改配置文件來實現(xiàn)對程序的控制。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: JYRoooy
import collections
import json
import toml
if __name__ == '__main__':
 myOrderDict = collections.OrderedDict
 myOrderDict = {'dict':[{'path':'E:/testing', 'include':['log_'], 'exclude': ['.swp', '.swx', 'tmp']},{'path':'E:/tmp', 'include':['.record'], 'exclude': ['.tmp']}]}
 myToml = toml.dump(myOrderDict, open('E:/python/code/PythonProject/tomlConfig.txt','w+'))

toml文件

格式說明, 一個 dict 對應(yīng)一個監(jiān)聽的文件夾和需要 過濾(exculde) 和 含有(include) 的字段,解釋一下,這里的字段只是文件名的字段,監(jiān)控 E:/testing 目錄下的文件,要包含 log_ 字段的文件,且不包含 .swp .swx .tmp 字段的文件, 并且監(jiān)控 E:/tmp 目錄下的文件,要包含 .record 字段的文件,且不包含 .tmp 的文件。

 

代碼

完整程序的代碼,具體解釋可以看注釋

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: JYRoooy
import toml
import hashlib
import os
import sys
import time
import importlib
import threading
importlib.reload(sys)

class myListener(threading.Thread):
 '''
 監(jiān)聽類
 '''
 def __init__(self, input_dir, filt_in, filt_ex): #文件夾路徑,必須包含的字符,必須過濾的字符
 threading.Thread.__init__(self)
 self.input_dir = input_dir
 self.filt_in = filt_in
 self.filt_ex = filt_ex
 self.dict = {} #用來存儲文件名和對應(yīng)的哈希值
 self.file_list = [] #存儲每一次掃描時的文件的文件名
 self.pop_list = [] #存儲需要刪除的文件名

 def run(self):
 while (1): #保證文件夾一直處于被監(jiān)聽的狀態(tài)
  for cur_dir, dirs, files in os.walk(self.input_dir):
  if files != []:
   self.file_list = []
   for each_file_1 in files:
   each_file = each_file_1
   if self.filt_in: #判斷文件名中是否有必須存在的字段
    flagone = 0
    for i in range(len(self.filt_in)):
    if self.filt_in[i] in each_file:
     flagone += 1
    if flagone == 0:
    continue

   if self.filt_ex: #判斷文件名中是否有必須過濾掉的字段
    flagtwo = 0
    for i in range(len(self.filt_ex)):
    if self.filt_ex[i] in each_file:
     flagtwo = 1
    if flagtwo==1:
    continue

   self.file_list.append(each_file)
   full_path = os.path.join(cur_dir, each_file)
   m = hashlib.md5() #實例化md5算法

   myFile = open(full_path, 'rb')

   for line in myFile.readlines():
    m.update(line)
   if each_file not in self.dict.keys(): #如果當前的dict中沒有這個文件,那么就添加進去
    self.dict[each_file] = m.hexdigest() #生成哈希值
    print('文件夾:' +cur_dir+ "中的文件名為:" + each_file + "的文件為新文件" + time.strftime('%Y-%m-%d %H:%M:%S',
           time.localtime(time.time())))
   if each_file in self.dict.keys() and self.dict[each_file] != m.hexdigest(): #如果當前dict中有這個文件,但是哈希值不同,說明文件被修改過,則需要對字典進行更新
    print('文件夾:' +cur_dir+ "中的文件名為:" + each_file + "的文件被修改于" + time.strftime('%Y-%m-%d %H:%M:%S',
           time.localtime(time.time())))
    self.dict[each_file] = m.hexdigest()
   myFile.close()
  pop_list = []
  for i in self.dict.keys():
   if i not in self.file_list: #當字典中有不在當前文件名列表中時,說明文件已經(jīng)被刪除
   print('文件夾:' +cur_dir+ '中的文件名為:' + i + "的文件已被刪除!!!" + time.strftime('%Y-%m-%d %H:%M:%S',
          time.localtime(time.time())))
   pop_list.append(i)
  for i in pop_list:
   self.dict.pop(i)

  time.sleep(2)

if __name__ == '__main__':
 threads = [] #用來存儲線程的線程池
 with open('E:/python/code/PythonProject/tomlConfig.txt','r+') as f: #讀取toml格式的文件,并分解格式
 mytoml = toml.load(f)
 myList = mytoml['dict']
 for i in range(len(myList)): #因為可能同時需要監(jiān)聽多個文件夾,所以利用線程池處理多線程
  json_list_include = []
  json_list_exclude = []
  mydir = myList[i]['path']
  for sublist in range(len(myList[i]['include'])):
  json_list_include.append(myList[i]['include'][sublist])
  for sublist in range(len(myList[i]['exclude'])):
  json_list_exclude.append(myList[i]['exclude'][sublist])
  thread1 = myListener(mydir, json_list_include, json_list_exclude) #生成線程
  threads.append(thread1)

 for t in threads: #開啟所有線程
  t.start();

運行結(jié)果

兩個文件夾中的文件

 

第一次運行程序, 可以看到已經(jīng)按照過濾規(guī)則完成了過濾和監(jiān)聽

修改 loko.record 文件為 loko.re,再來看結(jié)果

可以看到已經(jīng)完成了監(jiān)聽,因為 loko.re 文件,并符合監(jiān)聽的規(guī)則,所以不做出監(jiān)聽,而我們前面說過,一個修改相當于一個刪除和一個新建操作,所以監(jiān)聽程序提示原文件被刪除了

寫在后面

其他的效果我就不一一展示了。

程序也沒有實現(xiàn)很復雜的效果,代碼已經(jīng)上傳 github -- https://github.com/JYRoy/MyFileListener (本地下載

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Python使用Joblib模塊實現(xiàn)加快任務(wù)處理速度

    Python使用Joblib模塊實現(xiàn)加快任務(wù)處理速度

    在Python編程中,處理大規(guī)模數(shù)據(jù)或者進行復雜的計算任務(wù)時,通常需要考慮如何提高程序的運行效率,本文主要介紹了如何使用Joblib模塊來加快任務(wù)處理速度,需要的可以參考下
    2024-03-03
  • 詳解用python寫網(wǎng)絡(luò)爬蟲-爬取新浪微博評論

    詳解用python寫網(wǎng)絡(luò)爬蟲-爬取新浪微博評論

    這篇文章主要介紹了python爬取新浪微博評論,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • python操作xml文件詳細介紹

    python操作xml文件詳細介紹

    這篇文章主要介紹了python操作xml文件詳細介紹,著重介紹了獲取XML標簽的屬性和值的方法,需要的朋友可以參考下
    2014-06-06
  • Python中的異常處理簡明介紹

    Python中的異常處理簡明介紹

    這篇文章主要介紹了Python中的異常處理簡明介紹,本文講解了try-except檢測異常、上下文管理器(with…as…語句)、raise引發(fā)異常、斷言等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • python用moviepy對視頻進行簡單的處理

    python用moviepy對視頻進行簡單的處理

    這篇文章主要介紹了python如何用moviepy對視頻進行簡單的處理,幫助大家更好的利用python處理視頻,感興趣的朋友可以了解下
    2021-03-03
  • Python單元測試與測試用例簡析

    Python單元測試與測試用例簡析

    這篇文章主要介紹了Python單元測試與測試用例,結(jié)合簡單實例形式分析了Python單元測試相關(guān)的原理、步驟與相關(guān)注意事項,需要的朋友可以參考下
    2019-11-11
  • Pytorch神經(jīng)網(wǎng)絡(luò)參數(shù)管理方法詳細講解

    Pytorch神經(jīng)網(wǎng)絡(luò)參數(shù)管理方法詳細講解

    這篇文章主要介紹了Pytorch神經(jīng)網(wǎng)絡(luò)參數(shù)管理方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-05-05
  • python venv和virtualenv模塊詳解

    python venv和virtualenv模塊詳解

    venv 是 Python 內(nèi)置標準庫中創(chuàng)建輕量級虛擬環(huán)境的工具,本文通過示例代碼介紹python venv和virtualenv的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 關(guān)于python函數(shù)的建立、調(diào)用、傳參、返回值詳解

    關(guān)于python函數(shù)的建立、調(diào)用、傳參、返回值詳解

    這篇文章主要介紹了關(guān)于python函數(shù)的建立、調(diào)用、傳參、返回值詳解,Python?還支持自定義函數(shù),即將一段有規(guī)律的、可重復使用的代碼定義成函數(shù),從而達到一次編寫多次調(diào)用的目的,需要的朋友可以參考下
    2023-07-07
  • python:HDF和CSV存儲優(yōu)劣對比分析

    python:HDF和CSV存儲優(yōu)劣對比分析

    這篇文章主要介紹了python:HDF和CSV存儲優(yōu)劣對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評論

香格里拉县| 筠连县| 永州市| 循化| 驻马店市| 勐海县| 磴口县| 柳河县| 孙吴县| 泾阳县| 普安县| 贵南县| 太湖县| 资兴市| 滦南县| 龙州县| 景泰县| 宜阳县| 陕西省| 平罗县| 灵璧县| 金寨县| 宁海县| 霍林郭勒市| 甘洛县| 博白县| 右玉县| 六枝特区| 丹东市| 鲜城| 象州县| 永顺县| 黑龙江省| 额尔古纳市| 南通市| 凤阳县| 依安县| 榆中县| 灵宝市| 延吉市| 湄潭县|