1. 程式人生 > >模塊一

模塊一

簡化 隊列 處理 re模塊 div arch 隨機驗證碼 nod 則表達式

模塊

模塊..................................................................................................................................... 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將正則表達式編譯成為一個正則表達式對象,節省時間

模塊一