模塊一
模塊
模塊..................................................................................................................................... 1
1. os模塊......................................................................................................................... 2
2. sys模塊........................................................................................................................ 4
3. time模塊..................................................................................................................... 5
4. random模塊................................................................................................................ 9
5. 序列化模塊................................................................................................................ 12
6. collections模塊......................................................................................................... 14
7. re模塊....................................................................................................................... 16
1. 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
os.path.abspath(path) 返回path規範化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麽就會返回空值。
即os.path.split(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的大小
‘‘‘
os模塊是與操作系統交互的一個接口
os.stat(‘path/filename‘) 獲取文件/目錄信息 的結構說明
stat 結構:
st_mode: inode 保護模式
st_ino: inode 節點號。
st_dev: inode 駐留的設備。
st_nlink: inode 的鏈接數。
st_uid: 所有者的用戶ID。
st_gid: 所有者的組ID。
st_size: 普通文件以字節為單位的大小;包含等待某些特殊文件的數據。
st_atime: 上次訪問的時間。
st_mtime: 最後一次修改的時間。
st_ctime: 由操作系統報告的"ctime"。在某些系統上(如Unix)是最新的元數據更改的時間,在其它系統上(如Windows)是創建時間(詳細信息參見平臺的文檔)。
stat 結構
2. sys模塊
sys模塊是與python解釋器交互的一個接口
sys.argv 命令行參數List,第一個元素是程序本身路徑
sys.exit(n) 退出程序,正常退出時exit(0),錯誤退出sys.exit(1)
sys.version 獲取Python解釋程序的版本信息
sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform 返回操作系統平臺名稱
異常處理和status
import sys
try:
sys.exit(1)
except SystemExit as e:
print(e)
3. time模塊
常用方法
time.sleep(secs)
(線程)推遲指定的時間運行。單位為秒。
time.time()
獲取當前時間戳
表示時間的三種方式
時間戳
通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行“type(time.time())”,返回的是float類型。
元組(struct_time)
struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)
格式化的時間字符串
%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m 月份(01-12)
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鐘數(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%% %號本身
python中時間日期格式化符號:
時間戳是計算機能夠識別的時間;時間字符串是人能夠看懂的時間;元組則是用來操作時間的
幾種格式之間的轉換
重點代碼
計算時間差
import time
true_time=time.mktime(time.strptime(‘2017-09-11 08:30:00‘,‘%Y-%m-%d %H:%M:%S‘))
time_now=time.mktime(time.strptime(‘2017-09-12 11:00:00‘,‘%Y-%m-%d %H:%M:%S‘))
dif_time=time_now-true_time
struct_time=time.gmtime(dif_time)
print(‘過去了%d年%d月%d天%d小時%d分鐘%d秒‘%(struct_time.tm_year-1970,struct_time.tm_mon-1,
struct_time.tm_mday-1,struct_time.tm_hour,
struct_time.tm_min,struct_time.tm_sec))
計算時間差
4. random模塊
#隨機小數
random.random() # 大於0且小於1之間的小數
random.uniform(1,3) #大於1小於3的小數
#隨機整數
>>> random.randint(1,5) # 大於等於1且小於等於5之間的整數
>>> random.randrange(1,10,2) # 大於等於1且小於10之間的奇數
#隨機選擇一個返回
random.choice([1,‘23‘,[4,5]]) # #1或者23或者[4,5]
#隨機選擇多個返回,返回的個數為函數的第二個參數
random.sample([1,‘23‘,[4,5]],2) # #列表元素任意2個組合
#打亂列表順序
random.shuffle(item) # 打亂次序
重點代碼生成隨機驗證碼
import random
def v_code():
code = ‘‘
for i in range(5):
num=random.randint(0,9)
alf=chr(random.randint(65,90))
add=random.choice([num,alf])
code="".join([code,str(add)])
return code
print(v_code())
生成驗證碼
5. 序列化模塊
將原本的字典、列表等內容轉換成一個字符串的過程就叫做序列化。
序列化的目的
1、以某種存儲形式使自定義對象持久化;
2、將對象從一個地方傳遞到另一個地方。
3、使程序更具維護性。
Json模塊提供了四個功能:dumps、dump、loads、load
import json
dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘}
str_dic = json.dumps(dic) #序列化:將一個字典轉換成一個字符串
print(type(str_dic),str_dic) #<class ‘str‘> {"k3": "v3", "k1": "v1", "k2": "v2"}
#註意,json轉換完的字符串類型的字典中的字符串是由""表示的
dic2 = json.loads(str_dic) #反序列化:將一個字符串格式的字典轉換成一個字典
#註意,要用json的loads功能處理的字符串類型的字典中的字符串必須由""表示
print(type(dic2),dic2) #<class ‘dict‘> {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: ‘v3‘}
list_dic = [1,[‘a‘,‘b‘,‘c‘],3,{‘k1‘:‘v1‘,‘k2‘:‘v2‘}]
str_dic = json.dumps(list_dic) #也可以處理嵌套的數據類型
print(type(str_dic),str_dic) #<class ‘str‘> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class ‘list‘> [1, [‘a‘, ‘b‘, ‘c‘], 3, {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}]
loads和dumps
import json
f = open(‘json_file‘,‘w‘)
dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘}
json.dump(dic,f) #dump方法接收一個文件句柄,直接將字典轉換成json字符串寫入文件
f.close()
f = open(‘json_file‘)
dic2 = json.load(f) #load方法接收一個文件句柄,直接將文件中的json字符串轉換成數據結構返回
f.close()
print(type(dic2),dic2)
load和dump
json & pickle 模塊
json,用於字符串 和 python數據類型間進行轉換
pickle,用於python特有的類型 和 python的數據類型間進行轉換
6. collections模塊
擴展的數據類型
namedtuple
生成可以使用名字來訪問元素內容的tuple
queue
先進先出
deque
雙向隊列
雙端隊列,可以快速的從另外一側追加和推出對象
defaultdict
有序字典
OrderedDict
帶有默認值的字典
Counter
計數器,主要用來計數
7. re模塊
正則表達式
常用匹配符
\d+ 可以匹配多個數字
\d+? 可以匹配一部分數字(一組)
^ 匹配行首
$ 匹配行尾
^\d 第一個必須為數字
\d$ 最後一個必須為數字
\s 匹配一個空格
\d{3,8} 匹配3-8個數字
[0-9a-zA-Z\_] 可以匹配一個數字、字母或者下劃線;
[0-9a-zA-Z\_]+ 可以匹配至少由一個數字、字母或者下劃線組成的字符串,比如‘a100‘,‘0_Z‘,‘Py3000‘等等;
[a-zA-Z\_][0-9a-zA-Z\_]* 可以匹配由字母或下劃線開頭,後接任意個由一個數字、字母或者下劃線組成的字符串,也就是Python合法的變量;
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19} 更精確地限制了變量的長度是1-20個字符(前面1個字符+後面最多19個字符)。
. 匹配任意個字符
* 匹配任意個字符(包括0個)
? 匹配0個或1個字符
+ 匹配至少一個字符
{n} n個字符
{n,m} n-m個字符
入門到精通
基礎
? ‘00\d‘ 可以匹配 ‘007‘ ,但無法匹配 ‘00A‘ ;
? ‘\d\d\d‘ 可以匹配 ‘010‘ ;
? ‘\w\w\d‘ 可以匹配 ‘py3‘ ;
. 可以匹配任意字符,所以:
? ‘py.‘ 可以匹配 ‘pya‘ 、 ‘pyb‘ 、 ‘py!‘ 等等。
要匹配變長的字符,在正則表達式中,用 * 表示任意個字符(包括0個),用 + 表示至少一個字符,用 ? 表示0個或1個字符,用 {n} 表示n個字符,用 {n,m} 表示n-m個字符:(? ‘00\d‘ 可以匹配 ‘007‘ ,但無法匹配 ‘00A‘ ;, ? ‘\d\d\d‘ 可以匹配 ‘010‘ ;, ? ‘\w\w\d‘ 可以匹配 ‘py3‘ ;, . 可以匹配任意字符,所以: , ? ‘py.‘ 可以匹配 ‘pya‘ 、 ‘pyb‘ 、 ‘py!‘ 等等。 )
強化
? [0-9a-zA-Z\_] 可以匹配一個數字、字母或者下劃線;
? [0-9a-zA-Z\_]+ 可以匹配至少由一個數字、字母或者下劃線組成的字符串,比如 ‘a100‘ , ‘0_Z‘ , ‘Py3000‘ 等等;
? [a-zA-Z\_][0-9a-zA-Z\_]* 可以匹配由字母或下劃線開頭,後接任意個由一個數字、字母或者下劃線組成的字符串,也就是Python合法的變量;
? [a-zA-Z\_][0-9a-zA-Z\_]{0, 19} 更精確地限制了變量的長度是1-20個字符(前面1個字符+後面最多19個字符)。
A|B 可以匹配A或B,所以 (P|p)ython 可以匹配 ‘Python‘ 或者 ‘python‘ 。
^ 表示行的開頭, ^\d 表示必須以數字開頭。
$ 表示行的結束, \d$ 表示必須以數字結束。
要做更精確地匹配,可以用 [] 表示範圍(? [0-9a-zA-Z\_] 可以匹配一個數字、字母或者下劃線;, ? [0-9a-zA-Z\_]+ 可以匹配至少由一個數字、字母或者下劃線組成的字符串,比如 ‘a100‘ , ‘0_Z‘ , ‘Py3000‘ 等等;, ? [a-zA-Z\_][0-9a-zA-Z\_]* 可以匹配由字母或下劃線開頭,後接任意個由一個數字、字母或者下劃線組成的字符串,也就是Python合法的變量;, ? [a-zA-Z\_][0-9a-zA-Z\_]{0, 19} 更精確地限制了變量的長度是1-20個字符(前面1個字符+後面最多19個字符)。, A|B 可以匹配A或B,所以 (P|p)ython 可以匹配 ‘Python‘ 或者 ‘python‘ 。, ^ 表示行的開頭, ^\d 表示必須以數字開頭。, $ 表示行的結束, \d$ 表示必須以數字結束。)
re模塊
強烈建議使用Python的 r 前綴,就不用考慮轉義的問題了
match() 方法判斷是否匹配,如果匹配成功,返回一個 Match 對象,否則返回 None
切分字符串
用正則表達式切分字符串比用固定的字符更靈活
分組
正則表達式還有提取子串的強大功能。用 () 表示的就是要提取的分組(Group)
貪婪匹配
正則匹配默認是貪婪匹配,也就是匹配盡可能多的字符
由於\d+采用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配空字符串了。
必須讓 \d+ 采用非貪婪匹配(也就是盡可能少匹配),才能把後面的 0 匹配出來,加個 ? 就可以讓 \d+ 采用非貪婪匹配:
編譯
在Python中使用正則表達式時,re模塊內部會幹兩件事情
1.編譯正則表達式,如果正則表達式的字符串本身不合法,會報錯;
2.用編譯後的正則表達式去匹配字符串。
編譯後生成Regular Expression對象,由於該對象自己包含了正則表達式,所以調用對應的方法時不用給出正則字符串。
search 找到一個就返回,最多只匹配一個。findAll可返回多個、match的話從第一個個字符開始匹配,search則是全文
finditer返回一個存放匹配結果的叠代器,節省空間;compile將正則表達式編譯成為一個正則表達式對象,節省時間
模塊一