您好,登錄后才能下訂單哦!
sys模塊是與Python解釋器交互的一個接口
os模塊是與操作系統交互的一個接口
re模塊的使用過程
# 導入re模塊
import re
# 使用match方法進行匹配操作
result = re.match(正則表達式,要匹配的字符串)
# 如果上一步匹配到數據的話,可以使用group方法來提取數據
result.group()
匹配單個字符
字符 | 功能 |
---|---|
. | 匹配任意1個字符(除了\n) |
[ ] | 匹配[ ]中列舉的字符 |
\d | 匹配數字,即0-9 |
\D | 匹配非數字,即不是數字 |
\s | 匹配空白,即 空格,tab鍵 |
\S | 匹配非空白 |
\w | 匹配單詞字符,即a-z、A-Z、0-9、_ |
\W | 匹配非單詞字符 |
匹配多個字符
字符 | 功能 |
---|---|
* | 匹配前一個字符出現0次或者無限次,即可有可無 |
+ | 匹配前一個字符出現1次或者無限次,即至少有1次 |
? | 匹配前一個字符出現1次或者0次,即要么有1次,要么沒有 |
{m} | 匹配前一個字符出現m次 |
{m,n} | 匹配前一個字符出現從m到n次 |
匹配開頭或結尾
字符 | 功能 |
---|---|
^ | 匹配字符串開頭 |
$ | 匹配字符串結尾 |
匹配分組
字符 | 功能 |
---|---|
| | 匹配左右任意一個表達式 |
(ab) | 將括號中字符作為一個分組 |
\num | 引用分組num匹配到的字符串 |
(?P<name>) | 分組起別名 |
(?P=name) | 引用別名為name分組匹配到的字符串 |
match 僅僅查找第一個位置,如果找不到,返回None
import re
result = re.match("kernel","kernel.cn")
result.group()result = re.match("kernel","kernel.cn")
result.group() # kernel
serach 僅僅返回一個結果
import re
ret = re.search(r"\d+", "閱讀次數為 9999")
ret.group() # 9999
findall 返回最多能匹配的個數
import re
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret) # ['9999', '7890', '12345']
sub 將匹配到的數據進行替換
import re
ret = re.sub(r"\d+", '998', "python = 997")
print(ret) # Python = 998
貪婪和非貪婪
正則表達式模式中使用到通配字,那它在從左到右的順序求值時,會盡量抓取滿足匹配最長字符串,在我們上面的例子里面,+會從字符串的啟始處抓取滿足模式的最長字符,其中包括我們想得到的第一個整型字段的中的大部分,\d+只需一位字符就可以匹配,而+則匹配了從字符串起始符合規則的所有字符,解決方式就是非貪婪操作符?,這個操作符可以用在*、+、?的后面,要求正則匹配的越少越好
r的作用
Python中字符串前面加上 r 表示原生字符串,與大多數編程語言相同,正則表達式里使用"\"作為轉義字符,這就可能造成反斜杠困擾,假如你需要匹配文本中的字符"\",那么使用編程語言表示的正則表達式里將需要4個反斜杠"\":前兩個和后兩個分別用于在編程語言里轉義成反斜杠,轉換成兩個反斜杠后再在正則表達式里轉義成一個反斜杠,Python里的原生字符串很好地解決了這個問題,有了原生字符串,你再也不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直
時間處理模塊
time模塊的幾種轉換方式
時間戳轉換為結構化時間
結構化時間轉化為時間戳
結構化時間轉化為字符串時間
字符串時間轉化為結構化時間
日期處理模塊
只能適用于Python的基本數據類型,跨語言
適用于Python的所有數據類型,但是只針對Python
日志處理模塊
日志的級別
默認情況下Python的logging模塊將日志打印到了標準輸出中,且只顯示了大于等于WARNING級別的日志,這說明默認的日志級別設置為WARNING(日志級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG)
日志的配置
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='/tmp/test.log',
filemode='w')
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
配置參數
logger對象配置
logger = logging.getLogger('kernel') # 創建logging對象
logger.setLevel(logging.DEBUG) # 指定全局被處理消息級別(全局處理消息級別要高于或等于局部消息處理級別)
ch = logging.StreamHandler() # 屏幕流
ch.setLevel(logging.DEBUG) # 指定局部被處理消息級別
fh = logging.FileHandler("access.log") # 文件流
fh.setLevel(logging.WARNING) # 指定局部被處理消息級別
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 創建時間格式
ch.setFormatter(formatter) # 設置屏幕流時間格式
fh.setFormatter(formatter) # 設置文本流時間格式
logger.addHandler(ch) # 將屏幕流對象添加到logger中
logger.addHandler(fh) # 將文本流對象添加到logger中
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
加密模塊
obj = hashlib.md5() # 創建hashlib對象
obj = hashlib.md5(bytes('kernel',encoding='utf-8')) # 創建hashlib對象并加言
obj.update(bytes('hello',encoding='utf-8')) # 加密
ret = obj.hexdigest() # 獲取密文
操縱配置文件模塊
import configparser
cfg = configparser.ConfigParser() # 創建configparser對象
cfg.read('conf',encoding='utf-8') # 讀取配置文件
secs = cfg.sections() # 獲取所有節點
print(secs)
options = cfg.options(secs[0]) # 獲取指定節點的所有key
print(options)
item = cfg.items(secs[0]) # 獲取指定節點的鍵值對組合
print(item)
val = cfg.get(secs[0],options[0]) # 獲取指定節點下的指定key的值
print(val)
sec = cfg.remove_section(secs[0]) # 刪除指定節點
cfg.write(open('conf','w'))
print(sec)
sec = cfg.has_section('jiedian1') # 檢查是否存在該節點
print(sec)
sec = cfg.add_section('jiedian1') # 添加該節點
cfg.write(open('conf','w'))
print(sec)
cfg.set(secs[0],options[0],'111') # 修改指定節點下指定key的值
cfg.write(open('conf','w'))
cfg.remove_option(secs[0],options[0]) # 刪除指定節點下指定鍵值對
cfg.write(open('conf','w'))
from xml.etree import ElementTree as ET
from xml.dom import minidom
# 修改XML
"""
解析XML的方式有兩種
1.解析字符串方式
將字符串解析成XML對象,root代指XML文件的根節點
str_xml = open('xo.xml', 'r').read()
root = ET.XML(str_xml)
2.解析文件方式
獲取xml文件的根節點
tree = ET.parse("xo.xml")
root = tree.getroot()
"""
# 遍歷XML的所有內容
et = ET.parse('conf.xml')
root = et.getroot() # 獲取根節點
print(root)
print(root.tag) # 頂層標簽
for child in root: # 遍歷XML文檔的第二層
print(' ' + child.tag,child.attrib) # 第二層節點的標簽名和標簽屬性
for i in child: # 遍歷XML文檔的第三層
print(' ' + i.tag,i.attrib) # 第三層節點的標簽名和標簽屬性
print(' ' + str(i.text)) # 第三層節點的屬性
# 遍歷XML的指定節點
for node in root.iter('year'): # 遍歷XML的所有year節點
print(node.tag, node.text) # 節點的標簽名稱和內容
# 節點的標簽名稱和內容并修改節點內容
for node in root.iter('year'): # 遍歷XML的所有year節點
print(node.tag, node.text) # 節點的標簽名稱和內容
new_year = int(node.text) + 1 # 將year節點的內容增加1
node.text = str(new_year)
node.set('name', 'kernel') # 設置屬性和值
node.set('age', '18')
del node.attrib['name'] # 刪除屬性
# 刪除節點
for country in root.findall('country'): # 遍歷data下的所有country節點
rank = int(country.find('rank').text) # 獲取每一個country節點下rank節點的內容
if rank > 50:
root.remove(country) # 刪除指定country節點
"""
保存XML文件的方式也有兩種
1.解析字符串方式
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8')
2.解析文件方式
tree.write("new.xml",encoding='utf-8')
"""
# 創建XML文件
# 方式一
root = ET.Element("famliy")
son1 = ET.Element('son', {'name': '大兒子'}) # 創建大兒子節點
son2 = ET.Element('son', {"name": '二兒子'}) # 創建二兒子節點
grandson1 = ET.Element('grandson', {'name': '大孫子'}) # 在大兒子中創建兩個孫子
grandson2 = ET.Element('grandson', {'name': '二孫子'})
son1.append(grandson1) # 將孫子添加到兒子節點中
son1.append(grandson2)
root.append(son1) # 把兒子添加到根節點中
root.append(son1)
tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
# 方式二
root = ET.Element("famliy")
son1 = root.makeelement('son', {'name': '大兒子'}) # 創建大兒子節點
son2 = root.makeelement('son', {"name": '二兒子'}) # 創建二兒子節點
grandson1 = root.makeelement('grandson', {'name': '大孫子'}) # 在大兒子中創建兩個孫子
grandson2 = root.makeelement('grandson', {'name': '二孫子'})
son1.append(grandson1) # 將孫子添加到兒子節點中
son1.append(grandson2)
root.append(son1) # 把兒子添加到根節點中
root.append(son1)
tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
# 方式三
root = ET.Element("famliy")
son1 = root.SubElement('son', {'name': '大兒子'}) # 創建大兒子節點
son2 = root.SubElement('son', {"name": '二兒子'}) # 創建二兒子節點
grandson1 = root.SubElement('grandson', {'name': '大孫子'}) # 在大兒子中創建兩個孫子
grandson2 = root.SubElement('grandson', {'name': '二孫子'})
son1.append(grandson1) # 將孫子添加到兒子節點中
son1.append(grandson2)
root.append(son1) # 把兒子添加到根節點中
root.append(son1)
tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) # short_empty_elements=False 表示控制元素的格式如果值為False,沒有內容,它們是作為一個單獨閉合的標簽,否則它們會以一對的形式發射開始/結束標記
# 方式四 原生保存的XML時默認無縮進,如果想要設置縮進的話,需要修改保存方式
def prettify(elem):
"""將節點轉換成字符串,并添加縮進。
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent="\t")
root = ET.Element("famliy")
son1 = ET.Element('son', {'name': '大兒子'}) # 創建大兒子節點
son2 = ET.Element('son', {"name": '二兒子'}) # 創建二兒子節點
grandson1 = ET.Element('grandson', {'name': '大孫子'}) # 在大兒子中創建兩個孫子
grandson2 = ET.Element('grandson', {'name': '二孫子'})
son1.append(grandson1) # 將孫子添加到兒子節點中
son1.append(grandson2)
root.append(son1) # 把兒子添加到根節點中
root.append(son1)
raw_str = prettify(root)
f = open("xxxo.xml",'w',encoding='utf-8')
f.write(raw_str)
f.close()
執行系統命令模塊
call 執行命令,返回狀態碼
check_call 執行命令,如果執行狀態碼是 0 ,則返回0,否則拋異常
check_output 執行命令,如果狀態碼是 0 ,則返回執行結果,否則拋異常
subprocess.Popen(...) 用于執行復雜的系統命令
import subprocess
"""
終端輸入的命令分為兩種:
輸入即可得到輸出,如:ifconfig
輸入進行某環境,依賴再輸入,如:python
"""
# 執行普通命令
ret1 = subprocess.Popen(["mkdir","t1"])
ret2 = subprocess.Popen("mkdir t2", shell=True)
# 在指定目錄上創建文件夾
obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
# 依賴環境的命令
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
obj.stdin.write("print(1)\n")
obj.stdin.write("print(2)")
out_error_list = obj.communicate()
print(out_error_list)
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
out_error_list = obj.communicate('print("hello")')
print(out_error_list)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。