1. 程式人生 > >python常用模組(模組和包的解釋,time模組,sys模組,random模組,os模組,json和pickle序列化模組)

python常用模組(模組和包的解釋,time模組,sys模組,random模組,os模組,json和pickle序列化模組)

1.1模組

什麼是模組:

在計算機程式的開發過程中,隨著程式程式碼越寫越多,在一個檔案裡程式碼就會越來越長,越來越不容易維護。

為了編寫可維護的程式碼,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的程式碼就相對較少,在python中。一個.py檔案就稱為一個模組(Module)

使用模組的好處:

提高了程式碼的可維護性。

其次,編寫程式碼不必從零開始。當一個模組編寫完畢,就可以被其他地方引用。我們編寫程式的時候也經常引用其他模組,包括python的內建的模組和第三方模組。

 

包(package)的概念:

如果不同的人編寫的模組名相同怎麼辦?

為了避免模組名衝突,python有引入了按目錄組織模組的方法,稱為包(Package)

 

一個abc.py的檔案就是一個名字叫abc的模組。

假設,我們的abc和qaz這兩個模組名字與其他模組衝突了,於是我們可以通過包來組織模組,避免衝突,方法是選擇一個頂層的包名比如MyUser。

引入包以後,只要頂層的包名不與別人 衝突,那所有的模組都不會與別人衝突。現在abc.py模組的名字就變成了MyUser.abc,qaz模組名字就變成了MyUser.qaz.

多級包結構:包.包.模組

注:每個包目錄下面都會有一個——init——.py檔案,這個檔案是必須存在的,否則,python就把這個目錄當成普通目錄,而不是一個包。——init——.py可以是空檔案,裡面可以有程式程式碼,因為——init——.py就是一個模組,模組名就是MyUser

 

注:我們自已編寫模組名時,儘量不要與內建函式或則模組名字衝突。如同與系統的模組同名,否則無法匯入系統自帶的模組

 

模組分為3種:

1.自定義模組

2.內建標準模組(又稱標準庫)

3.第三方模組(開源模組)

 

回到頂部

1.1.1匯入模組

 1 #1語法import
 2 import  module1,module2,module3,module4
 3 
 4 #2from  xx import xx 語句
 5 from module  import   name1,name2
 6
7 #這個宣告不會把module模組匯入到當前的名稱空間,只會把name1,name2單個引入到執行的程式 8 9 from module.xx import name as rename 10 #把來自於modname.xx的name的重新改了一個名字,去掉用這個模組的方法 11 12 13 from module import * 14 #這提供了一個簡單的方法來匯入一個模組中的所有專案。這個匯入的模組的方法一般不推薦使用,如果引入的其它來源的命名,很有可能覆蓋已有的定義。
###路徑以當前執行的檔案為準
cat.py 
from module import cal

bin.py 
from module import cat
cat.cal.add()
###定位到m1,注意不是module_t.test()
module_t=__import__('m1.t')  
module_t.t.test()
###直接定位到t
import importlib
m=importlib.import_module('m1.t')
m.test() 
#對於模組的私有屬性(屬性加_),不能被from m1.t import *匯入,但是可以用from m1.t import test1,_test2

 

模組的執行本質

#1
import  test

#2 
from  modname  from  test

 

無論是1,還是2,首先通過sys.pyth找到test.py,然後執行test程式碼(全部執行)

區別是1會將test這個模組名載入到名字空間,而2只會將test這個變數名載入進來。

 

為模組新增路徑

#模組執行時通過sys.path的路徑一步一步查詢模組的
#匯入模組時是根據那個路徑作為基準來進行的呢?即:sys.path

#如果sys.path路勁列表中沒有你想要的路徑,可以通過sys.path.append("路徑")來新增
#當前這是臨時新增,如需永久新增則需修改系統的環境變數
import os,sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

 

開源模組安裝的常用方法

1 1.yum
2 2.pip
3 3.apt-get
回到頂部

 1.1.2__name__

python直譯器把一個特殊變數__name__的值為__main__

#很多模組檔案內容裡面都有

if __name__=='__main__':
       執行測試程式碼程式的邏輯


如果我們寫的模組檔案,需要被別人呼叫則不會執行下面的程式的邏輯

我們自已使用用,可以些執行整體程式程式碼的邏輯


自已用的時候 __name__=='__main__' , __name__的變數就等於'__main__',被當作模組匯入到其他的檔案裡時, __name__的變數不等於'__main__'

 

1.2sys模組

1 sys.argv   #在命令列引數是一個空列表,在其他中第一個列表元素中程式本身的路徑
2 sys.exit(n) #退出程式,正常退出時exit(0)
3 sys.version  #獲取python解釋程式的版本資訊
4 sys.path #返回模組的搜尋路徑,初始化時使用python PATH環境變數的值
5 sys.platform #返回作業系統平臺的名稱
6 sys.stdin    #輸入相關
7 sys.stdout  #輸出相關  
8 sys.stderror #錯誤相關
1 import sys,time
2 for i in range(1,20):
3     sys.stdout.write("#") #顯示寫入
4     time.sleep(0.2)
5     sys.stdout.flush() # 把每次寫入的東西都給重新整理到螢幕
 1 import sys,time
 2 
 3 def view_bar(num, total):
 4     rate = float(num) / float(total)
 5     rate_num = int(rate * 100)
 6     r = '\r%d%%' % (rate_num, ) #%% 表示一個%
 7     sys.stdout.write(r)
 8     sys.stdout.flush()
 9 if __name__ == '__main__':
10     for i in range(0, 101):
11         time.sleep(0.1)
12         view_bar(i, 100)

1.3time模組

在python中,通常3種時間的表示

1.時間戳(timestamp):時間戳表示的是從從1970年1月1日00:00:00開始按秒計算的偏移量。我們執行“type(time.time())”,返回的是float型別。

2.格式化的時間字串  (年-月-日  時:分:秒)

3.元組(struct_time)結構化時間:struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天,夏令時)

常用time模組方法

 1 #注:小白多用print(),檢視
 2 
 3 1#time.time() 時間戳
 4 print(time.time())
 5 
 6 2#time.localtime(second) 加上second(時間戳)轉換結構化時間,不加則顯示當前的結構化時間
 7 print(time.localtime())
 8 print(time.localtime(1371643198))
 9 
10 3#time.gmtime(second) #utc時區加上second(時間戳)轉換結構化時間,不加則顯示當前的結構化時間
11 print(time.gmtime())
12 print(time.gmtime(1391614837))
13 
14 4#mktime ()結構化時間轉換為時間戳
15 print(time.mktime(time.localtime()))
16 
17 5#time.ctime(seconds)#將加上時間戳轉換為時間戳的格式化時間,不加則返回當前的的格式化時間
18 print(time.time())
19 print(time.ctime(1331644244))
20 
21 6#time.asctime(p_tuple)#加引數是加一個結構化時間,把加的結構化時間轉換為格式化時間,不加則返回當前的格式化時間
22 print(time.asctime())
23 print(time.asctime(time.gmtime()))
24 
25 7#time.strftime(format,p_tuple)  #把一個結構化時間轉化相應的格式時間
26 print(time.strftime("%Y-%m-%d %X",time.localtime()))
27 
28 8#time.strptime(string,format) #把相應的格式時間,轉換為結構化時間
29 print(time.strptime("2015-5-20 20:22:36","%Y-%m-%d %X"))
30 #time.struct_time(tm_year=2015, tm_mon=5, tm_mday=20, tm_hour=20, tm_min=22, tm_sec=36, tm_wday=2, tm_yday=140, tm_isdst=-1)
31 
32 9#time.sleep(second)#將程式延遲指定的秒數執行
33 print(time.sleep(5))
34 
35 # 10 time.clock()
36 # 這個需要注意,在不同的系統上含義不同。在UNIX系統上,它返回的是“程序時間”,它是用秒錶示的浮點數(時間戳)。
37 # 而在WINDOWS中,第一次呼叫,返回的是程序執行的實際時間。而第二次之後的呼叫是自第一次呼叫以後到現在的執行
38 # 時間,即兩次時間差。

 

 

1.4random模組

 1 import random
 2 
 3 print(random.random())#隨機生成一個小於1的浮點數
 4 
 5 print(random.randint(1,3)) #[1-3]隨機生成1到3的數
 6 
 7 print(random.randrange(1,3)) #[1-3)隨機生成1到2的數
 8 
 9 print(random.choice([1,'23',[4,5]]))#隨機在列表中選取一個元素
10 
11 print(random.sample([1,'23',[4,5]],2))#隨機在列表中選取2個元素
12 
13 print(random.uniform(1,3))#隨機生成1-3的之間的浮點數
14 
15 print(random.shuffle([1,3,5,7,9]))#打亂列表中元素的順序
 1 import random
 2 
 3 def v_code():
 4     #隨機生成5位數的驗證碼
 5     code = ''
 6     for i in range(5):
 7         num=random.randint(0,9)
 8         alf=chr(random.randint(65,90))
 9         add=random.choice([num,alf])
10         code += str(add)
11     return code
12 print(v_code())

 1.5os模組

 1 os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑
 2 os.chdir("dirname")  改變當前指令碼工作目錄;相當於shell下cd
 3 os.curdir  返回當前目錄: ('.')
 4 os.pardir  獲取當前目錄的父目錄字串名:('..')
 5 os.makedirs('dirname1/dirname2')    可生成多層遞迴目錄
 6 os.removedirs('dirname1')    若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推
 7 os.mkdir('dirname')    生成單級目錄;相當於shell中mkdir dirname
 8 os.rmdir('dirname')    刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
 9 os.listdir('dirname')    列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印
10 os.remove()  刪除一個檔案
11 os.rename("oldname","newname")  重新命名檔案/目錄
12 os.stat('path/filename')  獲取檔案/目錄資訊
13 os.sep    輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
14 os.linesep    輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
15 os.pathsep    輸出用於分割檔案路徑的字串 win下為;,Linux下為:
16 os.name    輸出字串指示當前使用平臺。win->'nt'; Linux->'posix'
17 os.system("bash command")  執行shell命令,直接顯示
18 os.environ  獲取系統環境變數
19 os.path.abspath(path)  返回path規範化的絕對路徑
20 os.path.split(path)  將path分割成目錄和檔名二元組返回
21 os.path.dirname(path)  返回path的目錄。其實就是os.path.split(path)的第一個元素
22 os.path.basename(path)  返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
23 os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
24 os.path.isabs(path)  如果path是絕對路徑,返回True
25 os.path.isfile(path)  如果path是一個存在的檔案,返回True。否則返回False
26 os.path.isdir(path)  如果path是一個存在的目錄,則返回True。否則返回False
27 os.path.join(path1[, path2[, ...]])  將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略
28 print(os.path.join("D:\\python\\wwww","xixi"))   #做路徑拼接用的
29 #D:\python\wwww\xixi
30 
31 os.path.getatime(path)  返回path所指向的檔案或者目錄的最後存取時間
32 os.path.getmtime(path)  返回path所指向的檔案或者目錄的最後修改時間

 1.6json & pickle序列化模組

JSON表示的物件就是標準的JavaScript語言的物件,JSON和Python內建的資料型別對應如下:

 

json和內建函式的eval()方法,eval將一個字串轉成python物件,不過,eval 方法有侷限性,對於普通的資料型別,json.loads和eval都能用,但遇到特殊型別的時候,eval就不管用了所以eval的重點還是通常用來執行一個字串表示式,並返回表示式的值。

 1 import json
 2 aa = '{"name":"qa","age":11}'
 3 xixi="[1,2,3,4,5,6]"
 4 bb = "('1','2')"
 5 print(eval(aa))
 6 print(json.loads(aa))
 7 print(type(json.loads(xixi)))
 8 print(type(json.loads(aa)))
 9 # print(type(json.loads(bb))) #報錯[](){}裡面所有的元素的單引號必須改為雙引號,json不認單引號
10 
11 xx = "[xixi,haha]"
12 # print(eval(xx)) #報錯
13 print(json.dumps(xx))   #"[xixi,haha]"

 

什麼是序列化:

我們把物件(變數)從記憶體中變成可儲存或傳輸的過程稱之為序列化。

反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化。

json:用於字串和python資料型別間進行轉換。

pickle:用於python特有的型別和python的資料型別間進行轉換。

 json的dumps,loads的功能:

 1 import json
 2 data = {'k1':123,'k2':456}
 3 s_str=json.dumps(data)  #把data物件序列化成字串 >>>>>#序列化的過程
 4 # print(s_str)  #{"k2": 456, "k1": 123}
 5 # print(type(s_str)) str
 6 with open("js_new","w") as f:
 7     f.write(s_str)  #把json的字串寫入到檔案js_new
 8 
 9 #注:用之前先把上面的寫檔案的方式給註釋掉
10 with open("js_new","r") as f:
11     aa = json.loads(f.read())   #把字串重新讀到python原來資料物件  >>>>#反序列化過程
12     print(aa)
13     # print(type(aa)) #<class 'dict'>
dumps和loads

json的dump,load的功能

 1 import json
 2 data = {'k1':123,'k2':456}
 3 with open("json_dump","w") as f:
 4     json.dump(data,f)
 5 #json.dump(x,f) x是python原來資料的物件,f是檔案物件 主要是用來寫python物件到檔案裡面
 6 
 7 with open("json_dump","r") as f:
 8     bb = json.load(f)
 9     print(bb)
10     print(type(bb))  #<class 'dict'>
11 #json.read(f) #f是檔案物件,把檔案物件的資料讀取成原來python物件的型別
dump 和 read

json的dumps,loads,dump,load功能總結

json.dumps(x)   把python的(x)原物件轉換成json字串的物件,主要用來寫入檔案。

json.loads(f)   把json字串(f)物件轉換成python原物件,主要用來讀取檔案和json字串

json.dump(x,f)  把python的(x)原物件,f是檔案物件,寫入到f檔案裡面,主要用來寫入檔案的

json.load(file)  把json字串的檔案物件,轉換成python的原物件,只是讀檔案

 

pickle的功能

pickle和json的用法類似。

這裡我就不一一舉列了

 1 li = "[1,2,3,4,5,6,'aa']"
 2 aa = pickle.dumps(li)
 3 print(type(aa)) #<class 'bytes'>
 4 # print(pickle.dumps(li)) #bytes物件
 5 
 6 with open("pickle_new","wb") as p: #注意w是寫入str,wb時寫入位元組 ,wb寫入檔案是二進位制,
 7                                         # 我們看不到裡面的裡面寫入的檔案內容pickle_new
 8     pickle.dump(li,p)
 9 with open("pickle_new","rb") as p_b: #以二進位制方式讀取
10     # print(pickle.load(p_b))  #[1,2,3,4,5,6,'aa']
11     print(pickle.loads(p_b.read()))  #[1,2,3,4,5,6,'aa']

 

注:pickle的問題和所有其他程式語言特有的序列化的問題一樣,就是pickle它只能用於python,並且可能不同版本的python彼此都不相容,因此,只能用pickle儲存那些不重要的資料,不能成功的反序列化也沒關係。

 

1.1模組

什麼是模組:

在計算機程式的開發過程中,隨著程式程式碼越寫越多,在一個檔案裡程式碼就會越來越長,越來越不容易維護。

為了編寫可維護的程式碼,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的程式碼就相對較少,在python中。一個.py檔案就稱為一個模組(Module)

使用模組的好處:

提高了程式碼的可維護性。

其次,編寫程式碼不必從零開始。當一個模組編寫完畢,就可以被其他地方引用。我們編寫程式的時候也經常引用其他模組,包括python的內建的模組和第三方模組。

 

包(package)的概念:

如果不同的人編寫的模組名相同怎麼辦?

為了避免模組名衝突,python有引入了按目錄組織模組的方法,稱為包(Package)

 

一個abc.py的檔案就是一個名字叫abc的模組。

假設,我們的abc和qaz這兩個模組名字與其他模組衝突了,於是我們可以通過包來組織模組,避免衝突,方法是選擇一個頂層的包名比如MyUser。

引入包以後,只要頂層的包名不與別人 衝突,那所有的模組都不會與別人衝突。現在abc.py模組的名字就變成了MyUser.abc,qaz模組名字就變成了MyUser.qaz.

多級包結構:包.包.模組

注:每個包目錄下面都會有一個——init——.py檔案,這個檔案是必須存在的,否則,python就把這個目錄當成普通目錄,而不是一個包。——init——.py可以是空檔案,裡面可以有程式程式碼,因為——init——.py就是一個模組,模組名就是MyUser

 

注:我們自已編寫模組名時,儘量不要與內建函式或則模組名字衝突。如同與系統的模組同名,否則無法匯入系統自帶的模組

 

模組分為3種:

1.自定義模組

2.內建標準模組(又稱標準庫)

3.第三方模組(開源模組)

 

回到頂部

1.1.1匯入模組

 1 #1語法import
 2 import  module1,module2,module3,module4
 3 
 4 #2from  xx import xx 語句
 5 from module  import   name1,name2
 6 
 7 #這個宣告不會把module模組匯入到當前的名稱空間,只會把name1,name2單個引入到執行的程式
 8 
 9 from module.xx  import  name  as rename
10 #把來自於modname.xx的name的重新改了一個名字,去掉用這個模組的方法
11 
12 
13 from module  import   *
14 #這提供了一個簡單的方法來匯入一個模組中的所有專案。這個匯入的模組的方法一般不推薦使用,如果引入的其它來源的命名,很有可能覆蓋已有的定義。
###路徑以當前執行的檔案為準
cat.py 
from module import cal

bin.py 
from module import cat
cat.cal.add()
###定位到m1,注意不是module_t.test()
module_t=__import__('m1.t')  
module_t.t.test()
###直接定位到t
import importlib
m=importlib.import_module('m1.t')
m.test() 
#對於模組的私有屬性(屬性加_),不能被from m1.t import *匯入,但是可以用from m1.t import test1,_test2

 

模組的執行本質

#1
import  test

#2 
from  modname  from  test

 

無論是1,還是2,首先通過sys.pyth找到test.py,然後執行test程式碼(全部執行)

區別是1會將test這個模組名載入到名字空間,而2只會將test這個變數名載入進來。

 

為模組新增路徑

#模組執行時通過sys.path的路徑一步一步查詢模組的
#匯入模組時是根據那個路徑作為基準來進行的呢?即:sys.path

#如果sys.path路勁列表中沒有你想要的路徑,可以通過sys.path.append("路徑")來新增
#當前這是臨時新增,如需永久新增則需修改系統的環境變數
import os,sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

 

開源模組安裝的常用方法

1 1.yum
2 2.pip
3 3.apt-get
回到頂部

 1.1.2__name__

python直譯器把一個特殊變數__name__的值為__main__

#很多模組檔案內容裡面都有

if __name__=='__main__':
       執行測試程式碼程式的邏輯


如果我們寫的模組檔案,需要被別人呼叫則不會執行下面的程式的邏輯

我們自已使用用,可以些執行整體程式程式碼的邏輯


自已用的時候 __name__=='__main__' , __name__的變數就等於'__main__',被當作模組匯入到其他的檔案裡時, __name__的變數不等於'__main__'

 

1.2sys模組

1 sys.argv   #在命令列引數是一個空列表,在其他中第一個列表元素中程式本身的路徑
2 sys.exit(n) #退出程式,正常退出時exit(0)
3 sys.version  #獲取python解釋程式的版本資訊
4 sys.path #返回模組的搜尋路徑,初始化時使用python PATH環境變數的值
5 sys.platform #返回作業系統平臺的名稱
6 sys.stdin    #輸入相關
7 sys.stdout  #輸出相關  
8 sys.stderror #錯誤相關
1 import sys,time
2 for i in range(1,20):
3     sys.stdout.write("#") #顯示寫入
4     time.sleep(0.2)
5     sys.stdout.flush() # 把每次寫入的東西都給重新整理到螢幕
 1 import sys,time
 2 
 3 def view_bar(num, total):
 4     rate = float(num) / float(total)
 5     rate_num = int(rate * 100)
 6     r = '\r%d%%' % (rate_num, ) #%% 表示一個%
 7     sys.stdout.write(r)
 8     sys.stdout.flush()
 9 if __name__ == '__main__':
10     for i in range(0, 101):
11         time.sleep(0.1)
12         view_bar(i, 100)

1.3time模組

在python中,通常3種時間的表示

1.時間戳(timestamp):時間戳表示的是從從1970年1月1日00:00:00開始按秒計算的偏移量。我們執行“type(time.time())”,返回的是float型別。

2.格式化的時間字串  (年-月-日  時:分:秒)

3.元組(struct_time)結構化時間:struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天,夏令時)

常用time模組方法

 1 #注:小白多用print(),檢視
 2 
 3 1#time.time() 時間戳
 4 print(time.time())
 5 
 6 2#time.localtime(second) 加上second(時間戳)轉換結構化時間,不加則顯示當前的結構化時間
 7 print(time.localtime())
 8 print(time.localtime(1371643198))
 9 
10 3#time.gmtime(second) #utc時區加上second(時間戳)轉換結構化時間,不加則顯示當前的結構化時間
11 print(time.gmtime())
12 print(time.gmtime(1391614837))
13 
14 4#mktime ()結構化時間轉換為時間戳
15 print(time.mktime(time.localtime()))
16 
17 5#time.ctime(seconds)#將加上時間戳轉換為時間戳的格式化時間,不加則返回當前的的格式化時間
18 print(time.time())
19 print(time.ctime(1331644244))
20 
21 6#time.asctime(p_tuple)#加引數是加一個結構化時間,把加的結構化時間轉換為格式化時間,不加則返回當前的格式化時間
22 print(time.asctime())
23 print(time.asctime(time.gmtime()))
24 
25 7#time.strftime(format,p_tuple)  #把一個結構化時間轉化相應的格式時間
26 print(time.strftime("%Y-%m-%d %X",time.localtime()))
27 
28 8#time.strptime(string,format) #把相應的格式時間,轉換為結構化時間
29 print(time.strptime("2015-5-20 20:22:36","%Y-%m-%d %X"))
30 #time.struct_time(tm_year=2015, tm_mon=5, tm_mday=20, tm_hour=20, tm_min=22, tm_sec=36, tm_wday=2, tm_yday=140, tm_isdst=-1)
31 
32 9#time.sleep(second)#將程式延遲指定的秒數執行
33 print(time.sleep(5))
34 
35 # 10 time.clock()
36 # 這個需要注意,在不同的系統上含義不同。在UNIX系統上,它返回的是“程序時間”,它是用秒錶示的浮點數(時間戳)。
37 # 而在WINDOWS中,第一次呼叫,返回的是程序執行的實際時間。而第二次之後的呼叫是自第一次呼叫以後到現在的執行
38 # 時間,即兩次時間差。

 

 

1.4random模組

 1 import random
 2 
 3 print(random.random())#隨機生成一個小於1的浮點數
 4 
 5 print(random.randint(1,3)) #[1-3]隨機生成1到3的數
 6 
 7 print(random.randrange(1,3)) #[1-3)隨機生成1到2的數
 8 
 9 print(random.choice([1,'23',[4,5]]))#隨機在列表中選取一個元素
10 
11 print(random.sample([1,'23',[4,5]],2))#隨機在列表中選取2個元素
12 
13 print(random.uniform(1,3))#隨機生成1-3的之間的浮點數
14 
15 print(random.shuffle([1,3,5,7,9]))#打亂列表中元素的順序
 1 import random
 2 
 3 def v_code():
 4     #隨機生成5位數的驗證碼
 5     code = ''
 6     for i in range(5):
 7         num=random.randint(0,9)
 8         alf=chr(random.randint(65,90))
 9         add=random.choice([num,alf])
10         code += str(add)
11     return code
12 print(v_code())

 1.5os模組

 1 os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑
 2 os.chdir("dirname")  改變當前指令碼工作目錄;相當於shell下cd
 3 os.curdir  返回當前目錄: ('.')
 4 os.pardir  獲取當前目錄的父目錄字串名:('..')
 5 os.makedirs('dirname1/dirname2')    可生成多層遞迴目錄
 6 os.removedirs('dirname1')    若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推
 7 os.mkdir('dirname')    生成單級目錄;相當於shell中mkdir dirname
 8 os.rmdir('dirname')    刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
 9 os.listdir('dirname')    列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印
10 os.remove()  刪除一個檔案
11 os.rename("oldname","newname")  重新命名檔案/目錄
12 os.stat('path/filename')  獲取檔案/目錄資訊
13 os.sep    輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
14 os.linesep    輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
15 os.pathsep    輸出用於分割檔案路徑的字串 win下為;,Linux下為:
16 os.name    輸出字串指示當前使用平臺。win->'nt'; Linux->'posix'
17 os.system("bash command")  執行shell命令,直接顯示
18 os.environ  獲取系統環境變數
19 os.path.abspath(path)  返回path規範化的絕對路徑
20 os.path.split(path)  將path分割成目錄和檔名二元組返回
21 os.path.dirname(path)  返回path的目錄。其實就是os.path.split(path)的第一個元素
22 os.path.basename(path)  返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
23 os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
24 os.path.isabs(path)  如果path是絕對路徑,返回True
25 os.path.isfile(path)  如果path是一個存在的檔案,返回True。否則返回False
26 os.path.isdir(path)  如果path是一個存在的目錄,則返回True。否則返回False
27 os.path.join(path1[, path2[, ...]])  將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略
28 print(os.path.join("D:\\python\\wwww","xixi"))   #做路徑拼接用的
29 #D:\python\wwww\xixi
30 
31 os.path.getatime(path)  返回path所指向的檔案或者目錄的最後存取時間
32 os.path.getmtime(path)  返回path所指向的檔案或者目錄的最後修改時間

 1.6json & pickle序列化模組

JSON表示的物件就是標準的JavaScript語言的物件,JSON和Python內建的資料型別對應如下:

 

json和內建函式的eval()方法,eval將一個字串轉成python物件,不過,eval 方法有侷限性,對於普通的資料型別,json.loads和eval都能用,但遇到特殊型別的時候,eval就不管用了所以eval的重點還是通常用來執行一個字串表示式,並返回表示式的值。

 1 import json
 2 aa = '{"name":"qa","age":11}'
 3 xixi="[1,2,3,4,5,6]"
 4 bb = "('1','2')"
 5 print(eval(aa))
 6 print(json.loads(aa))
 7 print(type(json.loads(xixi)))
 8 print(type(json.loads(aa)))
 9 # print(type(json.loads(bb))) #報錯[](){}裡面所有的元素的單引號必須改為雙引號,json不認單引號
10 
11 xx = "[xixi,haha]"
12 # print(eval(xx)) #報錯
13 print(json.dumps(xx))   #"[xixi,haha]"

 

什麼是序列化:

我們把物件(變數)從記憶體中變成可儲存或傳輸的過程稱之為序列化。

反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化。

json:用於字串和python資料型別間進行轉換。

pickle:用於python特有的型別和python的資料型別間進行轉換。

 json的dumps,loads的功能:

 1 import json
 2 data = {'k1':123,'k2':456}
 3 s_str=json.dumps(data)  #把data物件序列化成字串 >>>>>#序列化的過程
 4 # print(s_str)  #{"k2": 456, "k1": 123}
 5 # print(type(s_str)) str
 6 with open("js_new","w") as f:
 7     f.write(s_str)  #把json的字串寫入到檔案js_new
 8 
 9 #注:用之前先把上面的寫檔案的方式給註釋掉
10 with open("js_new","r") as f:
11     aa = json.loads(f.read())   #把字串重新讀到python原來資料物件  >>>>#反序列化過程
12     print(aa)
13     # print(type(aa)) #<class 'dict'>
dumps和loads

json的dump,load的功能

 1 import json
 2 data = {'k1':123,'k2':456}
 3 with open("json_dump","w") as f:
 4     json.dump(data,f)
 5 #json.dump(x,f) x是python原來資料的物件,f是檔案物件 主要是用來寫python物件到檔案裡面
 6 
 7 with open("json_dump","r") as f:
 8     bb = json.load(f)
 9     print(bb)
10     print(type(bb))  #<class 'dict'>
11 #json.read(f) #f是檔案物件,把檔案物件的資料讀取成原來python物件的型別
dump 和 read

json的dumps,loads,dump,load功能總結

json.dumps(x)   把python的(x)原物件轉換成json字串的物件,主要用來寫入檔案。

json.loads(f)   把json字串(f)物件轉換成python原物件,主要用來讀取檔案和json字串

json.dump(x,f)  把python的(x)原物件,f是檔案物件,寫入到f檔案裡面,主要用來寫入檔案的

json.load(file)  把json字串的檔案物件,轉換成python的原物件,只是讀檔案

 

pickle的功能

pickle和json的用法類似。

這裡我就不一一舉列了

 1 li = "[1,2,3,4,5,6,'aa']"
 2 aa = pickle.dumps(li)
 3 print(type(aa)) #<class 'bytes'>
 4 # print(pickle.dumps(li)) #bytes物件
 5 
 6 with open("pickle_new","wb") as p: #注意w是寫入str,wb時寫入位元組 ,wb寫入檔案是二進位制,
 7                                         # 我們看不到裡面的裡面寫入的檔案內容pickle_new
 8     pickle.dump(li,p)
 9 with open("pickle_new","rb") as p_b: #以二進位制方式讀取
10     # print(pickle.load(p_b))  #[1,2,3,4,5,6,'aa']
11     print(pickle.loads(p_b.read()))  #[1,2,3,4,5,6,'aa']

 

注:pickle的問題和所有其他程式語言特有的序列化的問題一樣,就是pickle它只能用於python,並且可能不同版本的python彼此都不相容,因此,只能用pickle儲存那些不重要的資料,不能成功的反序列化也沒關係。