python之:map、filter、random、datatime,寫日誌,發郵件,操做mysql、redis,MD5加密,寫excel

1.map、filterphp

這兩個方法都是幫你調用函數的java

dir_names=['android','ios','tomcat','java','python','php','nginx']python

res=map(makdir,dir_names)  第一個參數是方法名,第二個參數是可循環的值,做用是將可循環值中的每個元素依次循環傳入到方法執行mysql

print(res)  此時不會打印出結果,由於map調用生成的結果放到生成器中,只有在使用時,纔會生成數據放到內存,想要打印出來就把res轉換成list,即list(res)android

all=[i for i in range(5)] #結果放到list,佔內存,空間換時間(一次獲得數據放到內存)ios

all=(i for i in range(5)) #結果放到生成器,節省空間,增長了cpu的工做量(每次都要計算一下獲得數據),rang()的實現也是一個生成器nginx

def my(num):
if num%2==0:
return True
res=list(filter(my,range(10))) #返回列表中爲真的數據,即range(10)中的數據
#只保留返回真的數據
res2=list(map(my,range(10)))
# 無論返回啥,都拿到
filter()  過濾,他把函數處理結果爲假的數據給過濾掉了,生成結果也是放到生成器
2.寫日誌
import nnlog
my_log=nnlog.Logger('rizhi.log',level='debug',when='s',backCount=5) #when按什麼時間單位生成日誌,backcount最多保存幾個日誌,多餘的刪除掉。level日誌的級別,可不寫該參數,默認爲bebug
my_log.debug('debug')  調試信息
my_log.info('info') 正常輸出
my_log.warning('warning') 警告
my_log.error('error') 出錯
debug、info、warning、error日誌級別依次升高
3.發送郵件
import yagmail
# 帳號 密碼(只能用郵箱受權碼) 郵件服務器(通常都用stmp協議) 收件人 抄送(非必填) 主題 正文 附件(非必填)
uesername='********@vip.qq.com'
passwd='zqdlhfeqdnbnbbbe'#受權碼,不是郵箱密碼
mail=yagmail.SMTP(user=uesername,password=passwd,host='smtp.qq.com',smtp_ssl=True)
# 安全協議,smtp_ssl=True若是是qq郵箱須要加這個參數,其餘不須要
mail.send(to='*********@qq.com',cc='********@163.com',subject='qwer',contents='sdf',attachments=r'C:\Users\Administrator\Desktop\筆記.txt')
# to 收件人 cc 抄送人 subject 主題 contents 內容 attachments 附件內容 多個時都是用列表的形式寫出
# 若是你發送的附件名,中文時亂碼的話
# pip uninstall yagmail,卸載掉,換個新的裝一下
4.操做mysql
# 1.鏈接數據庫:須要 ip 帳號 密碼 端口號 數據庫名稱
# 2.執行sql
# 3.獲取到結果
import pymysql
conn=pymysql.connect(host='***.***.***.***',user='***',password='123456',port=3306,db='***',charset='utf8',autocommit=True)#鏈接數據庫,加上autocommit=True 能夠直接對數據庫進行修改,其中port是int類型,注意不要加引號
cur=conn.cursor(cursor=pymysql.cursors.DictCursor)#創建遊標,相似於倉庫管理員。括號裏指定了數據的返回類型,沒有值時,默認返回二維元組
sql="insert into nhy(name,pwd) VALUE ('jc','123456')"
cur.execute(sql)
conn.commit() #對數據庫修改操做時,須要進行commit
cur.execute("select * from nhy where name='jc'")
# cur.execute('select * from nhy;') #執行sql語句,只是幫你執行sql語句,不會幫你返回結果
print(cur.description) #獲取表的信息
fileds=[filed[0] for filed in cur.description] #列表生成式,獲取到全部的字段
print(cur.fetchall()) #獲取全部結果,結果存放到二維元組當中
# print(cur.fetchone()) #只獲取一條數據
# print(cur.fetchmany(2))#指定獲取幾條
# 前邊結果被獲取過了,後邊結果就不能再被獲取了
cur.close() #遊標關閉
conn.close() #鏈接關閉

如下爲操做mysql數據庫的封裝函數,能夠直接拿來用
def my_db(ip,user,passwd,db,sql,port=3306,charset='utf8'):
coon=pymysql.connect(host=ip,user=user,password=passwd,db=db,port=port,charset=charset,autocommit=True)
cur=coon.cursor()
sql=sql.strip()
cur.execute(sql)
sql_start=sql[:6].lower() #取sql的開頭,而後轉化成小寫的
if sql_start.startswith('select') or sql_start.startswith('show'):
data=cur.fetchall()
else:
data='ok'
cur.close()
coon.close()
return data

5.操做redis
#傳統的關係型數據庫
# mysql oracle sql server sqllie db2
# id name passwd cratetime stu
# score
#數據存在磁盤上
# 使用sql語句來操做數據
# 表與表之間有關係
#非關係型數據庫 nosql
# {'name':'xxx',''}
# mongodb 數據存在磁盤上的
# redis 數據都是存在內存裏面

import redis
#鏈接redis
r = redis.Redis(host='***.***.***.***',port=6379,password='****',db=10)
#增刪改查
#操做string類型
# r.set('nhy_info','age 18 sex nan sdfsdfsdfsd') #增長、修改數據,傳入第三個參數時,表示key的失效時間,不設置或者爲-1時,表明永久生效
# res = r.get('nhy_info') #獲取數據,獲得bytes類型的數據,key不存在的話,不報錯,返回none
# bytes#二進制
# r.delete('nhy_info') #指定一個key刪除他,key不存在的話,不報錯
# print( res.decode() ) #編碼,bytes就變成了字符串
# print(r.keys('*info')) #獲取到全部的key
# print(r.exists('dashu_name')) #判斷這個key是否存在
# r.flushdb()#能夠清空當前數據庫裏面全部的key
# r.expire('session_crm',600)#指定key的失效時間
# print(r.ttl('session_crm'))#用來這個key的失效時間
# print(r.type('session_crm'))#看key的類型
#hash 哈希類的key

#哈希類型你理解爲一個字典嵌套字典
# redis的命令行裏面select 8 就是切換數據庫
# 操做hash類型的
#增刪改查
r.hset('fdfds','sasa','trtrsasae')
r.hset('fdfds','cxcx','hghghg')
r.hset('fdfds','fdfdf','trtre')
# 修改也是hset
# r.hdel('fdfds','sasa') #刪除指定的小key
# r.delete('fdfds') #直接刪除大key
# print(r.hget('fdfds','cxcx'))#獲取指定小key裏面的數據
res = r.hgetall('fdfds')#獲取到hash類型裏面全部的數據,存在字典裏,但k和v都是bytes類型的,須要轉換爲字符串類型,這裏就須要用.decode()方法
a = {}
for k,v in res.items():
a[k.decode()] = v.decode()
print(a)

如下是封裝好的redis操做模塊,之後能夠直接拿來用:
import redis
def op_str(k,v=None,t=None,ip='118.24.3.40', port=6379, passwd='HK139bc&*', db=10):
r=redis.Redis(host=ip, port=port, password=passwd, db=db)
if v:
r.set(k, v)
data='ok'
else:
if r.exists(k):
res=r.get(k)
data=res.decode()
else:
data='結果不存在'
return data

def op_hash(k1,k2=None,v=None,ip='118.24.3.40', port=6379, passwd='HK139bc&*', db=10):
r=redis.Redis(host=ip, port=port, password=passwd, db=db)
if k2:
if v:
r.hset(k1, k2, v)
res='ok'
else:
if r.hget(k1, k2):
res = r.hget(k1, k2).decode()
else:
res='結果不存在'
else:
if r.exists(k1):
a = r.hgetall(k1)
res = {}
for k, v in a.items():
res[k.decode()] = v.decode()
else:
res='結果不存在'
return res


6.MD5加密
import hashlib
s='123456'
m=hashlib.md5(s.encode()) #必須傳一個btyes類型的,後邊加.encode()
print(m.hexdigest()) #獲取到加密以後的結果
#MD5不可逆,不可解密
# 全部同樣的字符串,MD5加密以後的結果都是同樣的
# 撞庫來實現MD5解密的

如下是封裝好的MD5加密模塊,之後能夠直接拿來用:
def myMd5(s):
s = str(s)
m = hashlib.md5(s.encode()) #必須得傳一個bytes類型的
return m.hexdigest()

加鹽:當密碼很容易被破解時,可使用加鹽方法,即在密碼先後加上固定字符串,加上用戶名之類的值,做爲密碼,再進行MD5加密,這樣更加安全
7.寫excel
import xlwt
book=xlwt.Workbook() #建立excel
sheet=book.add_sheet('1') #加一個sheet頁
sheet.write(0,0,'學生編號') #行,列
book.save('ss.xls') #必定要以xls結尾

8.讀excel
xlwt #只能寫excel
import xlrd #只能讀
book = xlrd.open_workbook('nhy.xls') 打開指定的excel
print(book.nsheets)#獲取到excel裏面總共有多少個sheet頁
sheet = book.sheet_by_index(0) 指定操做第幾個sheet頁
book.sheet_by_name('sheet1') 指定操做那個sheet頁
# print(sheet.cell(0,0).value) #指定行和列,獲取某個單元格里面的內容
# print(sheet.cell(1,0).value)
print(sheet.row_values(0))#獲取某一行的數據
print(sheet.row_values(1))#獲取某一行的數據
print(sheet.nrows)#這個就是excel裏面總共有多少行
print(sheet.col_values(0))#某一列的數據
print(sheet.col_values(1))#某一列的數據
print(sheet.ncols)#總共有多少列
9.修改excel
import xlrdfrom xlutils import copybook1=xlrd.open_workbook('shuipingzuo.xls')# 打開原來的excelnew_book=copy.copy(book1)# 拷貝一個新的excelsheet=new_book.get_sheet(0)# 獲取第一個sheet頁sheet.write(1,3,18)new_book.save('shuipingzuo.xls')
相關文章
相關標籤/搜索