shutil,re,hashlib,subprocess模块及其相关
生活随笔
收集整理的這篇文章主要介紹了
shutil,re,hashlib,subprocess模块及其相关
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
shutil
高級的文件處理模塊
??? 封裝的更簡單了
??? 主要是文件的復(fù)制,移動,壓縮解壓縮
f1 = open("test.txt","rb")
f2 = open("testcopy.txt","wb")
shutil.copyfileobj(f1,f2)
shutil.copyfile("test.txt","testcopy3.txt")
需要保證目標(biāo)文件已經(jīng)存在
shutil.copymode("test.txt","testcopy3.txt")
shutil.copyfile("test.txt","testcopy4.txt")
# 需要保證目標(biāo)文件已經(jīng)存在
shutil.copystat("test.txt","testcopy4.txt")
# 壓縮與解壓縮
# base_name 指定壓縮文件的名字
# 默認(rèn)把當(dāng)前執(zhí)行文件所在目錄全部壓縮
# shutil.make_archive("abc","zip",r"D:\a")
# 如果同時指定了 root 和base??? base生效? 并且會把需要壓縮的文件所在的完整路徑一并壓縮
# shutil.make_archive("abc","zip",r"D:\a",base_dir=r"D:\b")
# shutil.make_archive("a","zip")
shutil.unpack_archive("abc.zip","mydir")
?
re
??? regexp 正則表達(dá)式
??? 正則表達(dá)式是什么
??????? 由一堆特殊符號組成的表達(dá)式
??? 作用
??????? 處理字符串
??????? 1.從字符串中獲取滿足某種規(guī)則的內(nèi)容,在爬蟲程序中大量出現(xiàn)
??????? 2.判斷一個字符串內(nèi)容是否滿足某個規(guī)則,例如:手機(jī)號驗證,郵箱驗證
??? # 生活中的規(guī)則非常多例如 讓有志青年過上體面的生活, 有志青年就是一條規(guī)則
??? 學(xué)習(xí)的重點就圍繞這一堆符號
import re
#
# print(re.findall("\w","a_1 *"))# ['a', '_', '1']
# # 只要是大寫字符 就是與小寫字符相反的意思
# print(re.findall("\W","a_1 *")) # [' ', '*']
#
# # 0-9
# print(re.findall("\d","123abc_*+-"))# ['1', '2', '3']
# print(re.findall("\D","123abc_*+-"))# ['a', 'b', 'c', '_', '*', '+', '-']
#
# #
# print(re.findall("\s"," \n\t\f\v1a*+-"))#[' ', '\n', '\t', '\f', '\v']
#
# print(re.findall("\S"," \n\t\f\v1a*+-"))#['1', 'a', '*', '+', '-']
# # print(" \n\t\v")
# 除了 \n \r
# 在 除了\n外的所有字符
# print(re.findall(".","abc_12\r\n3*+-_%%$#"))
# 單個字符匹配
# \w \d \s .
# 重復(fù)匹配 數(shù)字 字母下劃線
# * 表示0-無窮次
# 0次也滿足 則意味著 就算內(nèi)容沒有任何內(nèi)容匹配也會給你一個空字符 因為空字符也算0次匹配
print(re.findall("\w*","+-*"))
# 從網(wǎng)絡(luò)中下載一個HTML文檔? 從里面提取所需要的內(nèi)容
text = """
<img hidefocus="true" class='index-logo-src' src="//www.baidu.com/img/bd_logo1.png" width="270" height="129" usemap="#mp">
"""
print(re.findall('src=".*" width',text))
#
# +? 1-無窮次
print(re.findall("\w+","aaabcd"))#['aaabcd']
# 0-無窮
print(re.findall("\w*","aaabcd"))#['aaabcd', '']
#[a,b] 最少a 最多b次
print(re.findall("\w{1,}","aaabcda")) #['aaabcda']
#{1,} 1-無窮? 與+的意思相同
#{,2} 0-2
#{1,2} 1-2
#{,1} 0-1 與?意思相同
# print(re.findall("\w{1,}","a"))
print(re.findall("\w?","aa"))#['a', 'a', '']
# * 0-無窮(隨便幾次 沒有也行)
# + 1-無窮
# ? 0-1次
# {a,b} 手動指定匹配次數(shù)
text = "owen_dsb tanke_dsb kiven_dsb jerry"
print(re.findall("\w+_dsb",text))
?
# 轉(zhuǎn)義符
# print(re.findall("\w+.mp3","xxx.mp3"))
# print(re.findall(".","......"))
# 郵箱驗證
# print(re.findall("\w+@\w+.com","1212121212@163.com"))
print(re.findall("a\\\d","a\\d"))
print(re.findall("\\\\","\\"))
# print(re.findall("\*","*"))
# c:\\
# 位置匹配??? ^? $
#? ^從字符開始處匹配
print(re.findall("^a\w*","pabcdefg"))
# $ 從字符結(jié)尾處匹配
print(re.findall("a\w*g$","pabcdefg"))
# 1.是到最后看一眼是不是與表達(dá)式匹配? 如果不匹配直接放棄
# 2.如果結(jié)尾處沒問題 在回過頭來從前面開始匹配
# ^ 與 $ 同時出現(xiàn) 同時限定開始處和結(jié)尾處
print(re.findall("^p\w*g$","sabcdefg"))
print(re.findall("ab*","abbbbbsbbbbbbbbs"))
print(re.findall("a{2}","aaaaa"))
# 范圍匹配? 可以指定哪些內(nèi)容是你要 畫一個范圍
print(re.findall("a|b|c","abcdefg"))
#[abcd]
print(re.findall("[abcd]","absp"))
print(re.findall("[a-zA-Z0-9]","abcdefgr12121hjAAABBi"))
print(re.findall("[a\-b|a+b]","a-b"))
# 在范圍匹配時如果內(nèi)容中包含- 需要把它放在最前面或最后面
print(re.findall("[-a-z0-9]","-s0"))
# 模仿 \w? 數(shù)字 字母? 下劃線 [0-9a-zA-Z_]
print(re.findall("[^0-9]","121323abc _ + *"))
# 貪婪匹配? 與 非貪婪匹配
# 貪婪指的是 盡可能的匹配更多的內(nèi)容
# 非貪婪指的是 盡可能的匹配少的內(nèi)容
# 貪婪的例子:
print(re.findall("ab+","abbbbbbbbbb"))
# 貪婪的例子:
print(re.findall("ab+?","abbbbbbbbbb"))
print(re.findall("ab*?","abbbbbbbbbb"))
?
htm = """<img src="http://img.ivsky.com/img/tupian/t/201808/07/qingting-001.jpg" alt="輕盈停落的蜻蜓圖片">
title="輕盈停落的蜻蜓圖片 3996x2664" target="_blank"><img src="http://img.ivsky.com/img/tupian/t/201808/07/qingting-002.jpg">
"""
# 貪婪模式會一次性取到最后一個雙引號為止
# print(re.findall('src=".+"',htm))
# # 加上? 變成非貪婪模式
# print(re.findall('src=".+?"',htm))
# print(len(re.findall('src=".+?"',htm)))
# 當(dāng)我們需要從匹配結(jié)果中拿出來某一部分時就需要 分組 把你要的內(nèi)容加上括號即可
# print(re.findall('src="(.+?)"',htm))
# 當(dāng)我們需要從一個匹配結(jié)果中拿到多個不同部分時 可以加多個分組
# findall會把這些部分放到元組中
# print(re.findall('(src=)"(.+?)"',htm))
# print(re.findall('(src=")(?:.+?)"',htm))
print(re.findall("ab","ab abb abc abbb "))
# search 也是全文查找但是只返回 找到的第一個
print(re.search("ab","pasasasasasaab abb abc abbb ").group())
print(re.search("ab","pab abb abc abbb "))
# 從字符串開始匹配 第一個不匹配直接放棄 與^的效果相同
print(re.match("ab","pab abb abc abbb "))
# 將表達(dá)式打包成對象 這樣可以多次使用無需重新編寫
# p = re.compile("ab")
#
# res = p.match("pab abb abc abbb ")
# print(res)
#print(re.split("\s","pab\tabb\tabc\tabbb"))
# 替換內(nèi)容
# 待處理字符串? 舊的內(nèi)容 新的內(nèi)容
# \1 \2 表示引用匹配的分組內(nèi)容
# print(re.sub("(python)(.*)(python)",r"\1\2PYTHON","python is nb language python"))
# 交換字符串內(nèi)容 需求是把最前的和最后的換位置
print(re.sub("(.+?)(\|.+\|)(.+)",r"\3\2\1","java|PHP|C\+\+|python"))
# print(re.findall("a|b","ab"))
# print(re.search("","java|PHP|C\+\+|python"))
?
hash
??? unhashable? 不可hash 是可變的
??? hash 是一種算法
??????? 特點:
??? 1.輸入任意長度的數(shù)據(jù) 輸出固定長度的字符串,因此也稱之為信息摘要算法
??? 2.hash算法有很多實現(xiàn)方式,當(dāng)算符固定時,如果輸入相同,輸出結(jié)果必然相同
??????? (極小的幾率會出現(xiàn),不同的輸入產(chǎn)生相同的結(jié)果)
??? 3.無法通過hash結(jié)果反解出源數(shù)據(jù)
??? 使用場景
??? 1.可以用于加密
??? 2.用于文件校驗
??? # root 123
??? # root? asjdsajdsjladlsjadlsjadjk-
??? # 我不知道用戶明文密碼 意思時知道加密后的密碼
??? m = md5()
??? m.updat()
??? m.hexdigest()
??? 注意:加密的只能時字節(jié)類型? 得到的時字符串類型
? ? ??
import hashlib
# # 創(chuàng)建一個加密對象
m = hashlib.md5()
# 計算123456的hash值
m.update("abcabc".encode("utf-8"))
# 提取加密結(jié)果
# print(len(m.hexdigest()))
print(m.hexdigest())
# # 創(chuàng)建一個加密對象
# m = hashlib.sha512()
# # 計算123456的hash值
# m.update("123456".encode("utf-8"))
# # 提取加密結(jié)果
# print(len(m.hexdigest()))
# with open("2.re模塊.py","rb") as f:
#???? m = hashlib.md5()
#???? m.update(f.read())
#???? print(m.hexdigest())
# with open("userdb","wt") as f:
#???? res = input("pwd:")
#???? m = hashlib.md5()
#???? m.update(res.encode("utf-8"))
#???? r = m.hexdigest()
#???? f.write(r)
# with open("userdb","rt") as f:
#???? pwd = f.read()
#
#???? res = input("pwd:")
#???? m = hashlib.md5()
#???? m.update(res.encode("utf-8"))
#???? r = m.hexdigest()
#
#???? if r == pwd:
#???????? print("成功")
# update 可以多次執(zhí)行 也就意味? 你可以打開文件 讀一次就掉調(diào)用一次update
?
subprocess
??? 子進(jìn)程
??? 進(jìn)程就是一個正在運行中的程序
??? 一個進(jìn)程a在運行過程中開啟了另一個進(jìn)程b
??? b就稱之為a的子進(jìn)程
當(dāng)你的程序在運行過程中有一個任務(wù),不能直接處理,需要其他的程序
提供幫助時就需要開啟子進(jìn)程
subprocess 模塊的目的就是 要使得子進(jìn)程(執(zhí)行了一個系統(tǒng)指令)可以把數(shù)據(jù)輸出到我的程序中
import subprocess
# p = subprocess.Popen("dir",shell=True,stdout=subprocess.PIPE)
#
# res = p.stdout.read()
# print(res.decode("GBK"))
p1 = subprocess.Popen("tasklist",shell=True,stdout=subprocess.PIPE)
p2 = subprocess.Popen("findstr pycharm",shell=True,stdin=p1.stdout,stdout=subprocess.PIPE)
res = p2.stdout.read()
print(res)
?
總結(jié)
以上是生活随笔為你收集整理的shutil,re,hashlib,subprocess模块及其相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写给30岁的自己,以及所有即将、正在、已
- 下一篇: win10+centOS7双系统安装步骤