標籤:cti env 轉換 大於 建立檔案 icc 時間轉換 nod utf-8
sys
sys模組是與Python解譯器互動的一個介面
sys.argv 命令列參數List,第一個元素是程式本身路徑
sys.exit(n) 退出程式,正常退出時exit(0),錯誤退出sys.exit(1)
sys.version 擷取Python解釋程式的版本資訊
sys.path 返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform 返回作業系統平台名稱
os
os模組是與作業系統互動的一個介面
os.getcwd() 擷取當前工作目錄,即當前python指令碼工作的目錄路徑
os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd
os.curdir 返回目前的目錄: (‘.‘)
os.pardir 擷取目前的目錄的父目錄字元串名:(‘..‘)
os.makedirs(‘dirname1/dirname2‘) 可產生多層遞迴目錄
os.removedirs(‘dirname1‘) 若目錄為空白,則刪除,並遞迴到上一級目錄,如若也為空白,則刪除,依此類推
os.mkdir(‘dirname‘) 產生單級目錄;相當於shell中mkdir dirname
os.rmdir(‘dirname‘) 刪除單級空目錄,若目錄不為空白則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir(‘dirname‘) 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印
os.remove() 除一個檔案
os.rename("oldname","newname") 重新命名檔案/目錄
os.stat(‘path/filename‘) 擷取檔案/目錄資訊
os.sep 輸出作業系統特定的路徑分隔字元,win下為"\",Linux下為"/"
os.linesep 輸出當前平台使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用於分割檔案路徑的字串 win下為;,Linux下為:
os.name 輸出字串指示當前使用平台。win->‘nt‘; Linux->‘posix‘
os.system("bash command") 運行shell命令,直接顯示
os.popen("bash command).read() 運行shell命令,擷取執行結果
os.environ 擷取系統內容變數
os.path.abspath(path) 返回path正常化的絕對路徑 os.path.split(path) 將path分割成目錄和檔案名稱二元組返回 os.path.dirname(path) 返回path的目錄
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對路徑,返回True
os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False
os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略
os.path.getatime(path) 返回path所指向的檔案或者目錄的最後訪問時間
os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間
os.path.getsize(path) 返回path的大小
re
Regex,用來做字串的匹配操作
元字元
. 除分行符號以外的任何一個字元
? 匹配0到1個任一字元
(+) 匹配1到多個任一字元
(*) 匹配0到多個任一字元
{,num2} 配置0到num2個{}前面那個字元
{num1,num2} 匹配num1到num2個{}前面那個字元
{num1,} 匹配num1到多個{}前面那個字元
^ 以……開頭
$ 以……結尾
[a-z] 字元集,允許匹配a-z的任意一個字元,在[]中,除^代表非,\外,其他元字元不再有特殊意義
\ 後面跟元字元表示去除元字元特殊功能
> \d 匹配任何十進位數,相當於[0-9]
> \D 匹配任何非數字字元,相當於[^0-9]
> \s 匹配任何非空白字元,相當於[ \t\n\r\f\v]
> \S 匹配任何非空白字元,相當於[^ \t\n\r\f\v]
> \w 匹配任何字母數字字元,相當於[a-zA-Z0-9]
> \W 匹配任何非字母數字字元,相當於[^a-zA-Z0-9]
> \b 匹配一個單詞邊界
> r 原生字元
re.findall(‘kernel‘,‘kernelhjghjgbhjhjkerneljhjh‘) 在後面的那個字串中找到符合前面規則的字串以列表的形式返回
re.match(pattern,string,flag=0) 只從字串開頭開始匹配,配置成功,就會返回一個match object對象,必須到調用match object對象的方法才可以拿到值
> start() 返回匹配開始的位置
> end() 返回匹配結束的位置
> span() 返回一個元祖包含匹配(開始,結束)的位置
> group() 返回匹配成功的字串
> groups() 擷取模型中匹配到的分組結果
> groupdict() 同上,以key:value的形式 r = re.match(‘h(?P<name>\w+)’) 則key=name value=as
re.serach() 和match()類似,區別是可以從字串的任意位置開始匹配,但只會匹配一次
re.sub(pattern,repl,string,max) 替換,根據pattern配置,將匹配的結果替換成repl,max表示最大替換次數
re.subn() 和re.sub()類似,區別是將匹配的次數也返回
re.split() 分割
re.compile() 將匹配規則封裝成一個對象,在重複多次相同規則匹配的情境中效率會提高
time
時間處理模組
time模組的幾種轉換方式
print(time.time()) 時間戳記
print(time.strftime("%Y-%m-%d %X")) 格式化的時間字串
print(time.localtime()) 本地時區的struct_time
print(time.gmtime()) UTC時區的struct_time
時間戳記轉換為結構化時間
now_time = time.time() 時間戳記
print(now_time)
struct_time = time.localtime(now_time) 時間戳記轉換為結構化時間
print(struct_time)
結構化時間轉化為時間戳記
struct_time = time.localtime(time.time()) 結構化時間
print(struct_time)
now_time = time.mktime(struct_time) 結構化時間轉換為時間戳記
print(now_time)
結構化時間轉化為字串時間
struct_time = time.localtime(time.time()) 結構化時間
print(struct_time)
str_time = time.strftime("%Y-%m-%d",struct_time) 結構化時間轉換為字串時間
print(str_time)
字串時間轉化為結構化時間
str_time = "2018-04-17" 字串時間
struct_time = time.strptime(str_time,"%Y-%m-%d") 字串時間轉換為結構化時間
print(struct_time)
timedate
日期處理模組
timedate.date.today() 輸出日期
timedate.date.fromtimestamp() 接收時間戳記,轉換成日期
timedate.current_time() 輸出日期時間毫秒值
timedate.current_time.timetuple() 將日期時間毫秒值轉換成struct_time
timedate.current_time.replace() 替換日期
json
只能適用於Python的基礎資料型別 (Elementary Data Type),跨語言
json.loads() 接收一個字串,轉換成Python資料類型
json.load() 從文化中讀取字串,轉換成Python資料類型
json.dumps() 接收一個Python資料類型。轉換成字串
json.dump() 接收一個Python資料類型,轉換成字串,寫入到檔案中
pickle
適用於Python的所有資料類型,但是只針對Python
pickle.loads() 接收位元組,轉換成Python資料類型
pickle.load() 從文化中讀取位元組,轉換成Python資料類型
pickle.dumps() 接收一個Python資料類型。轉換成位元組
pickle.dump() 接收一個Python資料類型,轉換成位元組,寫入到檔案中
logging
Tlog模組
日誌的層級
預設情況下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‘)
配置參數
logging.basicConfig() 函數中可通過具體參數來更改logging模組預設行為,可用參數有:
filename:用指定的檔案名稱建立FiledHandler,這樣日誌會被儲存在指定的檔案中。
filemode:檔案開啟檔案,在指定了filename時使用這個參數,預設值為“a”還可指定為“w”。
format 指定handler使用的日誌顯示格式。
datefmt:指定日期時間格式。
level:設定rootlogger(後邊會講解具體概念)的記錄層級
stream:用指定的stream建立StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者檔案(f=open(‘test.log’,’w’)),預設為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。
format參數中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數字形式的記錄層級
%(levelname)s 文本形式的記錄層級
%(pathname)s 調用日誌輸出函數的模組的完整路徑名,可能沒有
%(filename)s 調用日誌輸出函數的模組的檔案名稱
%(module)s 調用日誌輸出函數的模組名
%(funcName)s 調用日誌輸出函數的函數名
%(lineno)d 調用日誌輸出函數的語句所在的程式碼
%(created)f 目前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d 輸出日誌資訊時的,自Logger建立以 來的毫秒數
%(asctime)s 字串形式的目前時間。預設格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
%(thread)d 程ID。可能沒有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID。可能沒有
%(message)s 使用者輸出的訊息
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‘)
hashlib
加密模組
obj = hashlib.md5() # 建立hashlib對象obj = hashlib.md5(bytes(‘kernel‘,encoding=‘utf-8‘)) # 建立hashlib對象並加言obj.update(bytes(‘hello‘,encoding=‘utf-8‘)) # 加密ret = obj.hexdigest() # 擷取密文
configparser
操縱設定檔模組
import configparsercfg = configparser.ConfigParser() # 建立configparser對象cfg.read(‘conf‘,encoding=‘utf-8‘) # 讀取設定檔secs = cfg.sections() # 擷取所有節點print(secs)options = cfg.options(secs[0]) # 擷取指定節點的所有keyprint(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‘))
XML
操作XML檔案模組
from xml.etree import ElementTree as ETfrom 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("xxxoo.xml",‘w‘,encoding=‘utf-8‘)f.write(raw_str)f.close()
subprocess
執行系統命令模組
call
> 執行命令,返回狀態代碼
> ret = subprocess.call(["ls", "-l"], shell=False)
> ret = subprocess.call("ls -l", shell=True)
check_call
> 執行命令,如果執行狀態代碼是 0 ,則返回0,否則拋異常
> subprocess.check_call(["ls", "-l"])
> subprocess.check_call("exit 1", shell=True)
check_output
> 執行命令,如果狀態代碼是 0 ,則返回執行結果,否則拋異常
> subprocess.check_output(["echo", "Hello World!"])
> subprocess.check_output("exit 1", shell=True)
subprocess.Popen(...)
> 用於執行複雜的系統命令
> 參數:
> args:shell命令,可以是字串或者序列類型(如:list,元組)
> bufsize:指定緩衝。0 無緩衝,1 行緩衝,其他 緩衝區大小,負值 系統緩衝
> stdin, stdout, stderr:分別表示程式的標準輸入、輸出、錯誤控制代碼
> preexec_fn:只在Unix平台下有效,用於指定一個可執行對象(callable object),它將在子進 程運行之前被調用
> close_sfs:在windows平台下,如果close_fds被設定為True,則新建立的子進程將不會繼承父進程的輸入、輸出、錯誤管道。
> close_sfs:在windows平台下,如果close_fds被設定為True,則新建立的子進程將不會繼承父進程的輸入、輸出、錯誤管道。
> close_sfs:在windows平台下,如果close_fds被設定為True,則新建立的子進程將不會繼承父進程的輸入、輸出、錯誤管道,所以不能將close_fds設定為True同時重新導向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。
> shell:同上
> cwd:用於設定子進程的目前的目錄
> env:用於指定子進程的環境變數。如果env = None,子進程的環境變數將從父進程中繼承。
> universal_newlines:不同系統的分行符號不同,True -> 同意使用 \n
> startupinfo與createionflags只在windows下有效,將被傳遞給底層的CreateProcess()函數,用於設定子進程的一些屬性,如:主視窗的外觀,進程的優先順序等等
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)
Python常用模組總結