我的python學習筆記1

2021-06-28 08:47:23 字數 4743 閱讀 9709

createdmd5listcode.py

沒有系統的學習過一門程式語言,即使學校學習時也不過聽說過而已。工作之後越發感覺到coding的強大,遂又拾起來開始漫漫學習之路。

朋友推薦學習python,所以就從python開始。

工作上剛好可以提供一些需求,來幫助我確定乙個短期的目標,以實現一些工作上的便利為目的,開啟我的python路。

這個筆記是學習了幾天之後,學了很多,但都沒有乙個記錄,只是以文字形式儲存於電腦內,不便於翻閱檢視,偶然想到在學習時翻看的一些幫助部落格,遂也開始用部落格的形式來記錄我的python筆記。

本文是第一篇,開題,當然,也是後期補錄的,**是翻閱幫助baidu很多之後慢慢成型的。

需求:給定乙個目錄,實現該目錄下所有檔案的md5值。

(工作上有很多資料需要儲存與轉移,所以需要驗證檔案的md5值確保檔案的完整。其實該功能工作上已經給定了乙個特定的小工具,但該工具僅僅識別工作特定結構的目錄,沒有普遍性,所以就以實現人和目錄結構下檔案目錄的md5值為功能需求)

想法:首先是檔案的md5值,這裡用到了hashlib模組:

import hashlib

### 輸入file完整路徑,返回其md5值:

def getfilemd5(file):

##判斷輸入是否合法:

if not os.path.isfile(file):

return "請輸入正確的檔案完整路徑!"

##判斷檔案是否太大,太大會造成記憶體過載,直接退出:

elif os.path.getsize(file)>3*(1024**4):

return "輸入的檔案過大,請更換檔案後重試(>3gb)"

####計算合法的檔案md5值:

else:filehashtemp = hashlib.md5()

with open(file,'rb') as md5f:

filehashtemp.update(md5f.read())

return filehashtemp.hexdigest()

其中最後幾行是實現md5的核心演算法(生成md5的方法其實還有,這裡我只是用到了其中乙個): 

filehashtemp = hashlib.md5()

with open(file,'rb') as md5f:

filehashtemp.update(md5f.read())

md5=filehashtemp.hexdigest()##md5值

其次是需要遍歷整個目錄結構,一下是**:

###遍歷給出的dir路徑下所有檔案,返回其檔案數量(個)與總大小(bytes):

def getdirinfo(dir):

##判斷路徑的有效性:

if not os.path.isdir(dir):

return "請輸入正確的完整資料夾路徑!"

##計算檔案個數與大小:

else:

dirsumsize = 0

dirfilecount = 0

for dirpath,dirnames,filenames in os.walk(dir):

for filename in filenames:

dirfilecount = dirfilecount + 1

dirsumsize = dirsumsize + os.path.getsize(os.path.join(dirpath,filename))

return dirfilecount,dirsumsize

這裡用到了os.path.walk(dir)。

還有就是進度的顯示:

我想到的演算法是每計算完乙個檔案的md5值,計數就加1,完成md5檔案總大小/總目錄的總大小就是處理進度。

處理速率實現:檔案大小/處理該檔案所使用的時長。

以下是全**:

#coding:gbk

import os,os.path

import sys

import hashlib

import time,datetime

### 輸入file完整路徑,返回其md5值:

def getfilemd5(file):

##判斷輸入是否合法:

if not os.path.isfile(file):

return "請輸入正確的檔案完整路徑!"

##判斷檔案是否太大,太大會造成記憶體過載,直接退出:

elif os.path.getsize(file)>3*(1024**4):

return "輸入的檔案過大,請更換檔案後重試(>3gb)"

####計算合法的檔案md5值:

else:

filehashtemp = hashlib.md5()

with open(file,'rb') as md5f:

filehashtemp.update(md5f.read())

return filehashtemp.hexdigest()

###遍歷給出的dir路徑下所有檔案,返回其檔案數量(個)與總大小(bytes):

def getdirinfo(dir):

##判斷路徑的有效性:

if not os.path.isdir(dir):

return "請輸入正確的完整資料夾路徑!"

##計算檔案個數與大小:

else:

dirsumsize = 0

dirfilecount = 0

for dirpath,dirnames,filenames in os.walk(dir):

for filename in filenames:

dirfilecount = dirfilecount + 1

dirsumsize = dirsumsize + os.path.getsize(os.path.join(dirpath,filename))

return dirfilecount,dirsumsize

if __name__ == '__main__':

##檢查是否有輸入引數:

if not len(sys.argv)==2:

print "請輸入路徑"

##判斷輸入路徑是否為檔案,是的話就直接輸出該檔案md5值:

elif os.path.isfile(sys.argv[1]):

print ' %s 的md5值:%s' % \

(os.path.split(sys.argv[1])[1] , (getfilemd5(sys.argv[1]).upper()))

##判斷輸入路徑是否為目錄,是的話就遍歷目錄,

##並生成各個檔案md5值儲存到當前路徑下的md5list.txt中:

elif os.path.isdir(sys.argv[1]):

gettingmd5count = 0 ##計算md5的個數

for dirpath,dirnames,filenames in os.walk(sys.argv[1]):

for filename in filenames:

filemd5startime = datetime.datetime.now()

##寫md5值到當前資料夾根目錄:

with open(os.path.join(sys.argv[1],'md5.txt'),'a') as md5valuelist:

md5valuelist.write(os.path.join(dirpath,filename)[21:]+'\t'+\

getfilemd5(os.path.join(dirpath,filename)).upper() + '\t' + \

str(os.path.getsize(os.path.join(dirpath,filename)))+'\n')

filemd5endtime = datetime.datetime.now()

timemd5microseconds = (filemd5endtime-filemd5startime).microseconds/1000000.0

if timemd5microseconds<0.001:

timemd5microseconds = 0.0005

gettingmd5count += 1

filespeed = os.path.getsize(os.path.join(dirpath,filename))/1024.0/1024 \

/ (timemd5microseconds)

##進度顯示:

sys.stdout.write('檢測到%d個檔案,當前正在處理第%d個檔案,處理進度:%.2f%%,速率:%.2fm/s \n' \

% (getdirinfo(sys.argv[1])[0],\

gettingmd5count,\

gettingmd5count*100.0/getdirinfo(sys.argv[1])[0],\

filespeed))

sys.stdout.flush()

問題:

1.處理速率還有問題,表現是顯示可能為0可能會很大很大!

分析原因有:時長的記錄,系統只能精確到100ms(1000000ms=1s),小檔案可以處理的很快;

如果之前該檔案的md5值計算過,那麼再次計算時感覺處理速度會很快!不知hashlib的具體處理流程。

我的python學習筆記 1

1.在程式中可隨時修改變數的值,而python將始終記錄變數的最新值。2.乙個簡單的python例項name.py message hello python world print message 3.字串就是一系列字元,在python中用括號括起來的都是字串,其中的引號可以是單引號,也可以是雙引號...

python我的學習筆記(1)

其實學習每一種語言,都可以找到很快樂的學習方法。有興趣,有樂趣,才會一直想學。知道print input if else就可以做乙個簡陋的遊戲了。print 列印函式,將資訊列印出來 input 將資訊列印,並且要求輸入一段話,並且把這段話。if 1 1 2 print 我是真,如果1 1等於2,就...

我的python學習筆記

五 運算子 六 字串 七 列表 八 順序執行 數值型別 字串 str 列表 list 元組 tuple 集合型別 set 字典型別 dict 布林型別 bool 型別 整數可以用字串型別佔位,反之不可。例 name 小t age 18 男 print s的年齡是 d,性別為 s name,age,s...