1. 程式人生 > >走入計算機的第二十六天(內置模塊4)

走入計算機的第二十六天(內置模塊4)

poll 讀取 input stdout 自定義 call 叠代器 流控 ons

一 補充正則表達式的其他一些使用方法

1.貪婪模式:在滿足匹配時,匹配盡可能長的字符串,默認情況下,采用貪婪匹配

1 #貪孌匹配
2 # ret=re.findall("abc+","abccccccccccccccgds")
3 # print(ret)
4 
5 # ret=re.findall("abc{1,}","abccccccccccccccgds")
6 # print(ret)

2非貪婪匹配:在滿足匹配時,匹配盡可能短的字符串,使用?來表示非貪婪匹配



1 #非貪孌模式
2 # ret=re.findall("abc+?","abccccccccccccccgds")
3
# print(ret) 4 5 # s="asfdhgfasflfhfas" 6 # ret=re.findall("as.*?as",s) 7 # print(ret)
幾個常用的非貪婪匹配Pattern
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復


3 .*?的用法:

1 . 是任意字符
2 * 是取 0 至 無限長度
3 ? 是非貪婪模式。
4 何在一起就是 取盡量少的任意字符,一般不會這麽單獨寫,他大多用在:
5 .*?x
6 
7
就是取前面任意長度的字符,直到一個x出現

4 re.findall

1 #import re
2 #re.findall()
3 # ret=re.findall("abc(?:\d)","abc34das")   #1返回的是列表的格式  2 findall優先篩選
4 # print(ret)

註意: findall的優先級查詢:

# import re
# 
# ret=re.findall(‘www.(baidu|oldboy).com‘,‘www.oldboy.com‘)
# print(ret)#[‘oldboy‘]     這是因為findall會優先把匹配結果組裏內容返回,如果想要匹配結果,取消權限即可
# # ret=re.findall(‘www.(?:baidu|oldboy).com‘,‘www.oldboy.com‘) # print(ret)#[‘www.oldboy.com‘]

5 re.split

 1 #分割
 2 # s="hello23fang54jie543jia"
 3 # ret=re.split("\d+",s)
 4 # print(ret)
 5 #
 6 # #自定義分割
 7 # s="hello23fang54jie543jia"
 8 # ret=re.split("\d+",s,1)
 9 # print(ret)
10 
11 #同時返回分隔符
12 # s="hello23fang54jie543jia"
13 # ret=re.split("(\d+)",s)
14 # print(ret)

註意 split的優先級查詢



1 ret=re.split("\d+","yuan2egon56alex")
2 print(ret)
3 
4 ret=re.split("(\d+)","yuan2egon56alex")
5 print(ret)
6 replace
#替換
# ret="hello fang".replace("fang","jie")
# print(ret)

7 re.sub

1 #多個同時替換
2 # ret=re.sub("f.*?g","jieshao","hello fang fhog felscg")
3 # print(ret)

8 re.subn

#多個替換,同時顯示替換詞數
# ret=re.subn("f.*?g","jieshao","hello fang fhog felscg")
# print(ret)

9 re.compile

#編譯
# obj=re.compile("\d+")
# a=obj.findall("sfjdskghr7o456o474o56j5h")
#print(a)
# ret=obj.findall("sdg36ew4375g5445y")  #和re.findall一樣,不過可以在多個使用時,同時使用一個編譯
# print(ret)

10 re.finditer

#叠代器
# ret=re.finditer("\d+","sdj6jtqbvw4y4n56m456h876nl;wnB%$5ln56l7jb6kn7jiuk3vtb5jnil6756")
# print(ret)
# print(next(ret).group())
# print(next(ret).group())
# print(next(ret).group())
# print(next(ret).group())
# print(next(ret).group())

二 configparser模塊

該模塊適用於配置文件的格式與windows ini文件類似,可以包含一個或多個節(section),每個節可以有多個參數(鍵=值)。

1 創建文件 如下

 1 #文件的基本格式是  例如:
 2 # [DEFAULT]
 3 # ServerAliveInterval = 45
 4 # Compression = yes
 5 # CompressionLevel = 9
 6 # ForwardX11 = yes
 7 #
 8 # [bitbucket.org]
 9 # User = hg
10 #
11 # [topsecret.server.com]
12 # Port = 50022
13 # ForwardX11 = no
14 
15 #configparser使用的格式是:分為三段,每段相當於是一個字典的形式,然後字典裏面在包含一個字典
16 #生成文件的方法是
17 #fang=configparser.ConfigParser()    #首先調用模塊的對象,然後再賦值給一個對象
18 #fang["DEFAULT"]={"key1":"vales1","key2‘:"vales2"........}
19 #fang[ "自定義字典名稱"]={"key1":"vales1","key2":‘vales2".....}
20 #fang["自定義字典名稱2”]={"key1":"vales1","key2":vales2"......}
21 #with open("要添加的路勁","w")as f:
22 #   fang.write(f)
23 
24 # import configparser
25 # #例如將下面內容寫入到文件中
26 # fang=configparser.ConfigParser()
27 # fang["DEFAULT"]={
28 #         "ServerAliveInterval" :45,
29 #         "Compression" :"yes",
30 #         "CompressionLevel" : 9,
31 #         "ForwardX11" : "yes"
32 # }
33 # fang["bitbucket.org"]={"User": "hg"}
34 # fang["topsecret.server.com"]={"Port" : 50022,"ForwardX11"  :"no"}
35 # with open("yuan.txt","w")as f:
36 #     fang.write(f)
37 #
創建的第一個字段名稱必須是DEFAULT名稱,後面創建的字段可以自定義名稱,第一個字段創建的內容會在後面創建的每一個字段中自動添加上去。
 

2 操作文件

 1 # #操作文件:讀與寫操作
 2 # import configparser
 3 # jie=configparser.ConfigParser()
 4 # jie.read("yuan.txt")
 5 # print(fang.sections())   #查字段的信息
 6 #
 7 # import configparser
 8 # jie=configparser.ConfigParser()
 9 # jie.read("yuan.txt")
10 # print(‘topsecret.server.com‘ in fang)  #查看字段是否在該字典裏
11 #
12 #
13 # import configparser
14 # jie=configparser.ConfigParser()
15 # jie.read("yuan.txt")
16 # print(fang.items("topsecret.server.com"))  #取出某個字段的內容
17 

3 查找文件

 1 # import configparser
 2 #
 3 # config = configparser.ConfigParser()
 4 #
 5 # #---------------------------查找文件內容,基於字典的形式
 6 #
 7 # print(config.sections())        #  []
 8 #
 9 # config.read(‘example.ini‘)
10 #
11 # print(config.sections())        #   [‘bitbucket.org‘, ‘topsecret.server.com‘]
12 #
13 # print(‘bytebong.com‘ in config) # False
14 # print(‘bitbucket.org‘ in config) # True
15 #
16 #
17 # print(config[‘bitbucket.org‘]["user"])  # hg
18 #
19 # print(config[‘DEFAULT‘][‘Compression‘]) #yes
20 #
21 # print(config[‘topsecret.server.com‘][‘ForwardX11‘])  #no
22 #
23 #
24 # print(config[‘bitbucket.org‘])          #<Section: bitbucket.org>
25 #
26 # for key in config[‘bitbucket.org‘]:     # 註意,有default會默認default的鍵
27 #     print(key)
28 #
29 # print(config.options(‘bitbucket.org‘))  # 同for循環,找到‘bitbucket.org‘下所有鍵
30 #
31 # print(config.items(‘bitbucket.org‘))    #找到‘bitbucket.org‘下所有鍵值對
32 #
33 # print(config.get(‘bitbucket.org‘,‘compression‘)) # yes       get方法取深層嵌套的值
34 #

三 subprocess模塊

當我們需要調用系統的命令的時候,最先考慮的os模塊。用os.system()和os.popen()來進行操作。但是這兩個命令過於簡單,不能完成一些復雜的操作,如給運行的命令提供輸入或者讀取命令的輸出,判斷該命令的運行狀態,管理多個命令的並行等等。這時subprocess中的Popen命令就能有效的完成我們需要的操作。

subprocess模塊允許一個進程創建一個新的子進程,通過管道連接到子進程的stdin/stdout/stderr,獲取子進程的返回值等操作。

The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes.(子進程模塊允許您生成新進程,連接到輸入/輸出/錯誤管道,並獲取其返回代碼。)

This module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.*(此模塊旨在替換其他較舊的模塊和函數,例如:os.system,os.spawn *,os.popen *,popen2。*,commands *)

這個模塊只一個類:Popen。

1 簡單命令

# import subprocess
#
# #  創建一個新的進程,與主進程不同步  if in win: s=subprocess.Popen(‘dir‘,shell=True)
# s=subprocess.Popen(‘ls‘)
# s.wait()                  # s是Popen的一個實例對象

2 命令帶參數

1 # import subprocess
2 # s=subprocess.Popen("Ls-L",shell=True)   #命令帶參數

3 控制子進程

當我們想要更個性化我們的需求的時候,就要轉向Popen類,該類生成的對象用來代表子進程。剛才我們使用到了一個wait方法

此外,你還可以在父進程中對子進程進行其它操作:

# s.poll() # 檢查子進程狀態
# s.kill() # 終止子進程
# s.send_signal() # 向子進程發送信號
# s.terminate() # 終止子進程
#
# s.pid:子進程號

‘‘‘

4 子進程的文本流控制

可以在Popen()建立子進程的時候改變標準輸入、標準輸出和標準錯誤,並可以利用subprocess.PIPE將多個子進程的輸入和輸出連接在一起,構成管道(pipe):

1 # import subprocess
2 # s=subprocess.Popen("Ls-L",shell=True,stdout=subprocess.PIPE)
3 # print(s.stdout.read())            #拿到一個字節
4 #
5 # import subprocess
6 # s=subprocess.Popen("Ls-L",shell=True,stdout=subprocess.PIPE)
7 # print(s.stdout.read().decode("gbk"))    #進行一個轉換

ubprocess.PIPE實際上為文本流提供一個緩存區。s1的stdout將文本輸出到緩存區,隨後s2的stdin從該PIPE中將文本讀取走。s2的輸出文本也被存放在PIPE中,直到communicate()方法從PIPE中讀取出PIPE中的文本。
註意:communicate()是Popen對象的一個方法,該方法會阻塞父進程,直到子進程完成

5 快捷API

‘‘‘
subprocess.call()

父進程等待子進程完成
返回退出信息(returncode,相當於Linux exit code)


subprocess.check_call()
父進程等待子進程完成
返回0,檢查退出信息,如果returncode不為0,則舉出錯誤subprocess.CalledProcessError,該對象包含
有returncode屬性,可用try…except…來檢查


subprocess.check_output()
父進程等待子進程完成
返回子進程向標準輸出的輸出結果
檢查退出信息,如果returncode不為0,則舉出錯誤subprocess.CalledProcessError,該對象包含
有returncode屬性和output屬性,output屬性為標準輸出的輸出結果,可用try…except…來檢查。

走入計算機的第二十六天(內置模塊4)