Python自動化學習筆記(六)——常用內置函數、os.walk了解、md5加密、連接數據庫
1.常用內置函數
print(max([1,2,3,4])) #獲取最大值
print(sum([1,2,3,4])) #求和
print(math.pi) #圓周率的值
print(chr(65)) #把數字轉成ascii碼表裏對應的值
print(ord(‘A‘)) #把字母轉為ascii碼表裏對應的數字
print(dir(bool)) #查看某個對象裏有哪些方法
bool() #轉bool類型,返回True或False
sorted(s,reverse=True) #排序,返回排序後的值,用list存儲,reverse=True則降序排序,字母用ascii碼來判斷
print(sorted({‘b‘:1,‘a‘:2})) #傳入字典,用key來排序,返回key排序後組成的list
print(list(reversed
for n,m in zip(name,money): #zip把多個list揉到一起,變成一個二維數組,可以用這種形式來循環獲取元素
print(list(zip(name,money))) #輸出[(‘nhy‘, 100), (‘lyl‘, 22), (‘qlm‘, 45)]
eval(‘‘) #執行一些簡單的python代碼:運算,定義變量,傳入字符串
exec("print(‘ss‘)") #執行復雜的python代碼
map 幫你循環調用函數,傳入函數名稱和存放變量的列表
filter 幫你循環調用函數,如果函數返回false,則過濾掉(傳入的list裏過濾,返回剩下的)
#map用法示例 def intToStr(num): return str(num).zfill(2) l=range(1,34) res=map(intToStr,l) #循環調用 print(list(res))
#lambda #匿名函數,功能很簡單的一個函數,用完一次就釋放
#lambda示例 a=lambda num:str(num).zfill(2) #冒號前面是入參,後面是返回值 print(a(1)) l=[2,34,5] print(list(map(lambda num:str(num).zfill(2),l)))
一個小例子,輸出結果如下,可以看出map和filter的區別
[False, True, False, True, False, True, False, True, False]
[2, 4, 6, 8]
print(list(map(lambda num:num%2==0,range(1,10)))) print(list(filter(lambda num:num%2==0,range(1,10))))
2.os.walk
os模塊的walk函數可以用來循環遍歷指定路徑下的所有文件和文件夾
代碼小示例,遍歷e盤,並打印所有路徑下的文件和文件夾
import os for cur_path, cur_dir, cur_files in os.walk(r‘e:\‘): print(‘當前路徑‘, cur_path) print(‘當前目錄下有哪些文件夾:‘, cur_dir) print(‘當前目錄下有哪些文件:‘, cur_files)
找出e盤下所有.mp4文件
#找出e盤下所有以.MP4結尾的的文件 def find_movie(keyWord,path=‘e:\\‘): for cur_path, cur_dir, cur_files in os.walk(path): for file in cur_files: if file.endswith(keyWord): print(‘當前路徑:‘,cur_path) print(‘文件:‘,file) find_movie(‘mp4‘,r‘E:\1.個人資料‘)
3.md5加密
hashlib模塊下的md5方法可以對傳入的字符串進行md5加密,必須傳入一個encode後的字符串
md5加密不可逆,無法解密,破解只能用撞庫的方式,因此,md5加密時,可以采用加鹽的方式來加密,多傳入一個自定義的字符串,和待加密的字符串拼接在一起再進行加密,這樣可以減少被撞庫成功的風險
重點方法:hashlib.md5(s).hexdigest
代碼示例:
def my_md5(s,salt=‘‘): s_new=(str(s)+salt).encode() #必須傳入encode後的字符串 m=hashlib.md5(s_new).hexdigest()#獲取加密後的字符串 return m s=‘123456Aaaa‘ print(my_md5(s,‘abc‘)) print(my_md5(123))
輸出:
5b701ee50c069926c768466035117c76
202cb962ac59075b964b07152d234b70
4.操作數據庫
1.獲取數據庫連接,使用pymysql.connect方法,傳入參數要使用key=value形式,例如:
conn=pymysql.connect(host=‘xx.xx.xx.xx‘,user=‘xxx‘,password=‘xxx‘,port=3306,db=‘jxz‘,charset=‘utf8‘,autocommit=‘True‘ )
2.建立遊標,相當於倉庫管理員,cur=conn.cursor()
3.執行sql語句,cur.execute(sql),只是執行sql,不會返回數據
4.insert和update語句提交後需要commit ,連接數據庫時加上autocommit=‘True‘就可以不寫這句:conn.commit()
4.獲取提交sql後的返回數據,cur.fetchall()#獲取到所有返回的數據,二維數組;cur.fetchone() #只獲取一條數據,一維數組
5.代碼示例,一個操作數據庫的函數,傳入sql和連接信息
def my_db(sql,host, user, password, db,port=3306,charset=‘utf8‘,autocommit=‘True‘): conn = pymysql.connect(host=host, user=user, password=password,db=db, port=port, charset=charset,autocommit=autocommit) cur = conn.cursor() # 建立遊標,相當於倉庫管理員 cur.execute(sql) res=cur.fetchall() cur.close() conn.close() return res
6.代碼示例,使用fetchone循環打印select的每一個結果
import pymysql conn=pymysql.connect(host=‘192.168.4.78‘,user=‘jxz‘,password=‘123456‘,port=3306,db=‘jxz‘,charset=‘utf8‘,autocommit=‘True‘ ) cur=conn.cursor() #建立遊標,相當於倉庫管理員 sql=‘select * from app_myuser;‘ cur.execute(sql)#只是執行sql,不會返回數據 # print(cur.fetchall())#獲取到所有返回的數據,二維數組 a=cur.fetchone() while a: #只獲取一條數據,一維數組 print(a) a=cur.fetchone() cur.close() conn.close()
5.練習
1.寫一個函數,傳入一個路徑和一個關鍵字(關鍵字是文件內容),找到文件內容裏面有這個關鍵字的文件
# 需求: # 1、寫一個函數,傳入一個路徑和一個關鍵字(關鍵字是文件內容),找到文件內容裏面有這個關鍵字的文件 import os import chardet def find_file(keyWord,path=‘e:\\‘): files=[] #定義一個數組,來存放包含關鍵字的文件 for cur_path, cur_dir, cur_files in os.walk(path): #遍歷指定的路徑下的所有文件和文件夾 for file in cur_files: if file.endswith(‘txt‘): with open(os.path.join(cur_path,file))as fr: content=fr.read() if content.upper().find(keyWord.upper()) != -1: # 文件內容是否包含關鍵字,忽略大小寫 files.append(‘path=%s filename=%s‘ % (cur_path, file)) # 包含,加入到files中 return files res=find_file(‘文件‘,r‘D:\工作文檔\個人‘) print(res)查找指定路徑包含關鍵字的txt文件
2.寫一個清理日誌的程序,把三天前的日誌刪掉,保留今天的、昨天和前天的。文件格式:ios_2018-11-21.log
# 2、寫一個清理日誌的程序,把三天前的日誌刪掉, # 保留今天的、昨天和前天的。 # 文件格式:ios_2018-11-21.log import os import time #時間戳轉格式化時間 def timestampToStr(timestamp=None,format=‘%Y-%m-%d %H:%M:%S‘): if timestamp: time1=time.gmtime(timestamp) #時間戳轉換為時間元組, res = time.strftime(format, time1) # 時間元組轉成格式化時間 else: res = time.strftime(format) # 獲取當前格式化的時間 return res #格式化時間轉時間戳 def strTotimestamp(str=None,format=‘%Y-%m-%d %H:%M:%‘): if str: timep = time.strptime(str, format) # 格式化時間先轉成時間元組 res = time.mktime(timep) else: res=time.time() #獲取當前時間戳 return int(res) #日誌時間是否過期 def is_outTime(s): if s.endswith(‘.log‘): #傳入的是一個日誌文件 log_time= s.split(‘.‘)[0].split(‘_‘)[1].replace(‘-‘,‘‘)+‘000000‘ log_timestamp=strTotimestamp(log_time,‘%Y%m%d%H%M%S‘)#解析日誌時間當天0點的時間戳 today_date=timestampToStr().split(‘ ‘)[0] today_timstamp=strTotimestamp(today_date.replace(‘-‘,‘‘)+‘000000‘,‘%Y%m%d%H%M%S‘)#獲取今天零點的時間戳 if today_timstamp-log_timestamp>259200: #日誌時間在三天內 return True #刪除符合條件的日誌文件 def delLogs(path=‘..‘): #默認操作路徑是當前文件的上層路徑 files=[] for cur_path,cur_dir,cur_files in os.walk(path): #遍歷傳入的文件路徑 for file in cur_files: if is_outTime(file): os.remove(os.path.join(cur_path,file)) #刪除文件 files.append({"path": cur_path, "filename": file}) return files #返回所有已刪除的文件名稱和所在路徑 print(delLogs())清理日誌文件
3.寫一個註冊的功能,要求數據存在數據庫裏面名字為空、已經存在都要校驗,校驗通過之後,密碼要存成md5加密的。
# 需求: # 寫一個註冊的功能,要求數據存在數據庫裏面 # 1、名字為空、已經存在都要校驗 # 2、校驗通過之後,密碼要存成密文的。 import pymysql import hashlib HOST=‘192.168.4.78‘ DB=‘jxz‘ def my_db(sql,host,user,passwd,db,port=3306,charset=‘utf8‘,autocommit=‘True‘): conn=pymysql.connect(host=host,user=user,passwd=passwd,db=db,port=port,charset=charset,autocommit=autocommit) cur=conn.cursor() cur.execute(sql) res=cur.fetchall() cur.close() conn.close() return res def write(user): sql="insert into lyc_user(username,password)VALUES (‘%s‘,‘%s‘)"%(user[‘username‘],user[‘password‘]) my_db(sql,host=HOST,user=‘jxz‘,passwd=‘123456‘,db=DB) def get_userinfo(): sql="select * from lyc_user" res=my_db(sql,host=HOST,user=‘jxz‘,passwd=‘123456‘,db=DB) if res: users_info=[{‘username‘:i[1],‘password‘:i[2]} for i in res] #將讀取出來的用戶信息用字典格式存儲,放到一個列表裏 else: users_info=[] return users_info #返回數據庫裏的用戶信息 def my_md5(s,salt=‘‘): #對密碼進行md5加密 s_new=(str(s)+salt).encode() m=hashlib.md5(s_new).hexdigest() return m def sigh(): users_info = get_userinfo() count=0 while count<3: name_input = input("歡迎註冊,請輸入用戶名:").upper() password_input = input("請輸入密碼:") cpassword_input = input("請確認密碼,請與上次輸入密碼保持一致:") if name_input.strip() == "" or password_input.strip() == "" or cpassword_input.strip() == "": print("用戶名或密碼為空,請重新輸入") # 判斷用戶名和密碼是否輸入為空 count+=1 continue elif password_input != cpassword_input: print("兩次輸入的密碼不一致,請重新輸入") count+=1 continue elif name_input in [i[‘username‘] for i in users_info]: print("用戶名已存在,請直接登錄") count+=1 break else: # 將註冊結果寫入數據庫 password_input=my_md5(password_input,‘lyc‘) user={"username":name_input,"password":password_input} write(user) print("註冊成功") break sigh()註冊
4.登錄,登錄的賬號密碼從數據庫裏面取,如果輸入用戶不存在要提示
# 需求: # 登錄的賬號密碼從數據庫裏面取, # 如果輸入用戶不存在要提示 import pymysql import hashlib import datetime HOST=‘192.168.4.78‘ DB=‘jxz‘ def my_db(sql,host,user,passwd,db,port=3306,charset=‘utf8‘,autocommit=‘True‘): conn=pymysql.connect(host=host,user=user,passwd=passwd,db=db,port=port,charset=charset,autocommit=autocommit) cur=conn.cursor() cur.execute(sql) res=cur.fetchall() cur.close() conn.close() return res def get_user(): sql="select * from lyc_user" res=my_db(sql,host=HOST,user=‘jxz‘,passwd=‘123456‘,db=DB) if res: return [(i[1],i[2])for i in res] return [] #返回數據庫裏的用戶信息,只返回username和password def my_md5(s,salt=‘‘): #對密碼進行md5加密 s_new=(str(s)+salt).encode() m=hashlib.md5(s_new).hexdigest() return m def login(): users_info = get_user() count=0 while count<3: name_input = input("歡迎登陸,請輸入用戶名:").upper() password_input = input("請輸入密碼:") user_input = (name_input,my_md5(password_input,‘lyc‘)) if name_input.strip() == "" or password_input.strip() == "": print("用戶名或密碼為空,請重新輸入") # 判斷用戶名和密碼是否輸入為空 count+=1 continue elif name_input not in [i[0] for i in users_info]:#取出所有的username print("用戶不存在,請重新輸入") count+=1 continue elif user_input in users_info: print("登陸成功,歡迎%s,當前時間:%s"%(name_input,datetime.datetime.today().strftime(‘%Y-%m-%d %H:%M:%S‘))) break else: print("密碼錯誤,登陸失敗") login()登錄
Python自動化學習筆記(六)——常用內置函數、os.walk了解、md5加密、連接數據庫