一、解析
【備注】主要講清單解析、字典解析和集合解析的概念。
1、處理檔案和目錄
a:python3自帶一個os子產品(代表作業系統operating system),os子產品包含非常多的函數用于擷取(和修改)本地目錄、檔案程序、環境變量等資訊。
b:os是python3自帶的,可以在任何地方導入。import os
c:擷取目前工作目錄:os.getcwd();
d:改變目前工作目錄:os.chdir();
2、處理檔案名和目錄名
a:os.path子產品包含了處理檔案名和目錄名的函數
b:os.path.join()函數從一個或者多個路徑片段中構造成一個路徑名。其可以接受任何數量的參數。
print(os.path.join(os.path.expanduser('~'),'diveintopython3', 'examples', 'humansize.py'))
結果:c: \Users\pilgrim\diveintopython3\examples\humansize.py
c:os.path.split()分割一個完整的路徑,并傳回目錄和檔案名。
split()函數的傳回值被賦給一個二進制組,每個變量獲得元組中對應元素的值。
例如:os.path.split(pathname)----》('/Usrs/p/d/examples', 'hum.py')
(dirname, filename) = os.path.split(pathname)
其中:dirname=‘/Usrs/p/d/examples' ; filename='hum.py'
d:os.path.splitext()用于分割檔案名并傳回檔案名和其擴充名。
例如:(shortname, extension) = os.path.splitext(filename)
shortname=’hum‘; extension=’.py‘【包含前面的點】
3、羅列目錄内容
a:glob子產品;可以通過程式設計的方法擷取一個目錄的内容。
b:用法:import glob引入 glob.glob(參數)調用
4、擷取檔案元資訊
a:檔案的元資訊:檔案建立時間、修改時間、檔案大小等資訊
b:os.stat(’參數‘)函數傳回一個或者多種檔案的元資訊的對象。參數接收檔案名。
例如:metadata = os.stat('feed.xml')
metadata.st_mtime:其中st_mtime擷取檔案最後修改時間。
metadata.st_size :其中st_size擷取檔案的大小。
5、構造絕對路徑
a:os.path.realpath()
6、清單解析
a:定義:通過對清單中每一個元素【elem】應用一個函數的方法來将一個清單映射到另一個清單。
例如:a_list = [elem * 2 for elem in a_list]
b:清單解析也可以過濾清單,生成比原清單短的清單。---如加入:if判斷條件
例如:[f for f in glob.glob('*.py') ifos.stat(f).st_size>6000]
7、字典解析
a:字典解析和清單解析一樣,隻不過生成的是字典。
b:可以通過字典解析交換字典的鍵和值:
例如:>>> a_dict = {'a': 1, 'b': 2, 'c': 3}
>>> {value:key for key, value in a_dict.items()} //items()函數傳回字典的所有鍵和值
{1: 'a', 2: 'b', 3: 'c'}
8、集合解析
二、字元串
1、字元串操作:
a:s.splitlines();對字元串按行進行分行輸出,産生一個字元串清單; b:s.lower():将字元串變為小寫;對應的有s.upper() c:s.count() :對指定的字元串進行計數 d:将一個有鍵值對形式的清單轉換成字典
例如:>>>query = 'key1=value1&key2=value2'
>>> a_list = query.split('&') //【split()之後我們得到的是一個清單】 >>>a_list ['key1=value1', 'key2=value2'] >>> a_list_of_lists = [v.split('=', 1)for v in a_list] >>> a_list_of_lists [ ['key1','value1'], ['key2', 'value2'] ] >>> a_dict = dict(a_list_of_lists) //實作清單到字典的轉換 {'key1 : value1', 'key2 : value2'}
2、字元串切片:
a:類似清單的切片,可以通過制定兩個索引值來獲得字元串的一個slice;如:>>> a_string[18:]
b:bytes對象和string對象互相轉換方法:decode()-----bytes轉換成字元串、encode() ----字元串轉bytes
如:a_string = by.decode('ascii')
三、正規表達式
1、正規表達式的相關功能在re子產品中
a:引入正規表達式:import re
b:re.sub( )函數可以做字元串的替換。^比對字元串的開始;$比對字元串的結束。
例如:
>>> s = '100 NORTH BROAD ROAD' //僅替換最後一個ROAD
>>> import re
>>> re.sub('ROAD$', 'RD.',s) //$表示以ROAD結束的詞
c:在字元串前加一個字元‘r’---表示字元串中沒有任何字元需要轉義。
d:‘\b’ 用此包含的字元,表示他必須是一個獨立的詞;不管在字元串的什麼位置
例如:
>>> s = '100 BROAD ROAD APT. 3' //【我們僅希望替換獨立單詞ROAD】
>>> re.sub(r'\bROAD\b', 'RD.', s) //r開頭表示字元串沒有轉義,\b包圍字元--表示此字元必須為單獨的一個詞
'100 BROAD RD. APT 3' //結果
e:re子產品的基本方法時search()函數。它使用正規表達式來比對字元串( M)。如果成功比對, search()傳回一個比對對象。如果沒有比對到,search()就傳回None.。
例如:
>>>import re
>>>pattern='^M?M?M?$'
>>>re.search(pattern, 'MM')
f:使用文法{n, m}
例如:
>>>pattern = '^M{0,3}$'
表示比對字元串開始,然後是任意的0到3個M字元。
2、松散正規表達式
a:其需要傳遞一個re.VERBOSE參數。表示用的是松散正規表達式
b:\d表示任意的數字(0-9);\D表示除數字外的所有字元;\d+;其中+表示一個或者多個;\d*:其中*表示又或者沒有
如:(\d{3})--放到圓括号裡表示一定要比對3個數字。
(\d+):表示一個或者多個數字;其中+表示一個或者多個
3、常用正規表達式的字元含義
a:^ 比對字元串開始位置
b:$ 比對字元串結束位置
c:\b 比對一個單詞邊界;結束和開始
d:\d 比對一個數字
e:\D 比對一個任意的非數字字元
f:x? 比對可選的 x 字元。換句話說,就是 0 個或者 1 個 x 字元。 【?可以認為是x的個數】
g:x* 比對 0 個或更多的 x。
h:x+ 比對 1 個或者更多 x。【至少一個】
i:x{n,m} 比對 n 到 m 個 x,至少 n 個,不能超過 m 個
k:(a|b|c) 比對單獨的任意一個 a 或者 b 或者 c。
l:(x) 這是一個組【括号括起來,表示一個組】,它會記憶它比對到的字元串。你可以用re.search 傳回的比對對象的 groups()函數來擷取到比對的值
k:中括号[ ]表示比對這些字元串之一,且隻能比對其中一個。
例如:re.search('[sxz]$', noun) 表示noun是否以s、x或者z結尾