python 內建模組續寫
阿新 • • 發佈:2021-11-27
python內建模組續寫,random、os、sys、json、subprocess模組應有盡有,超級詳細~
[toc]
python 內建模組續篇
接上篇python內建模組,續寫下面的模組
- random模組:隨機數
- os模組:作業系統相關的模組
- sys模組:python直譯器常用的模組
- json模組:資料互動專用模組
- subprocess模組:遠端操作經常使用的模組
1. random隨機數模組
random模組的方法如下:
- random.random():隨機產生一個0-1之間的小數
- random.randint(a,b):隨機產生一個a-b之間的整數
- random.uniform(a,b):隨機產生一個a-b之間的小數
- random.choice(seq):隨機從序列裡等概率的抽取一個元素
- random.sample(population,k,count):隨機抽取指定數量的樣本
- random.shuffle(list):隨機打亂容器中的諸多元素
方法使用示例:
1、random()方法
import random
# 隨機生成一個0-1之間的隨機數
num = random.random()
print(num)
# >>>0.9158120687169333
2、randint(a,b)方法
import random # 隨機生成一個範圍內的隨機數 num = random.randint(0,10) print(num) # >>>3
3、uniform(a,b)方法
import random
# 隨機生成一個範圍內的小數
num = random.uniform(0,5)
print(num)
# >>>2.3192301761260783
4、choice(seq)方法
import random
# 隨機抽取一個元素:抽獎示例
num = random.choice(['特等獎','一等獎','二等獎','三等獎','參與獎','謝謝惠顧'])
print(num)
# >>>特等獎
5、sample(population,k,count)方法
import random # 隨機抽取定量樣本,一次性抽取兩個 num = random.sample(['河北省','河南省','山東省','山西省','北京市','上海市'],2) print(num) # >>>['山西省', '北京市']
6、shuffle(list)方法
import random
# 打亂容器內的元素,洗牌示例
lst_card = [2,3,4,5,6,7,8,9,10,'A','J','Q','k',]
random.shuffle(lst_card) # 打亂順序,洗牌
print(lst_card)
# >>>[3, 'Q', 9, 4, 7, 2, 'A', 6, 'J', 10, 5, 8, 'k']
7、random模組綜合練習
'''
搜狗公司筆試題
隨機驗證碼可以是由 數字 小寫字母 大小寫字母 任意組合
編寫能夠產生五位數的隨機驗證碼
ps:五位 每位都可以是三種情況之一
'''
# 驗證碼的隨機性,使用random
import random
for i in range(5):
code_num = random.randint(0, 9) # 獲取0-9內的隨機數
code_lower = chr(random.randint(97, 122)) # 獲取a-z的字元,數字轉換為ASCII
code_upper = chr(random.randint(65, 90)) # 獲取A-Z的字元,數字轉換為ASCII
# 隨機抓取任意一個
get_code = random.choice([code_num,code_lower,code_upper])
print(get_code,end='')
升級版本
import random
# 定義一個可以獲取任意長度的驗證碼函式
def get_anylen_code(n):
code = ''
for i in range(n):
code_num = str(random.randint(0, 9)) # 獲取0-9內的隨機數
code_lower = chr(random.randint(97, 122)) # 獲取a-z的字元,數字轉換為ASCII
code_upper = chr(random.randint(65, 90)) # 獲取A-Z的字元,數字轉換為ASCII
# 隨機抓取任意一個
get_code = random.choice([code_num,code_lower,code_upper])
# print(get_code,end='')
code+=get_code
return code
# 獲取10位驗證碼
print(get_anylen_code(10)) # >>>0AP9xSUmFY
# 獲取6位驗證碼
print(get_anylen_code(6)) # >>>2q6de0
# 獲取4位驗證碼
print(get_anylen_code(4)) # >>>k3Y1
2、os模組
該模組經常和作業系統”打交道“,os模組的搭配使用方法如下:
- os.mkdir(資料夾):建立單級目錄
- os.makedirs(多級資料夾):建立多級目錄
- os.rmdir(資料夾):刪除空目錄
- os.removedirs(多級資料夾):刪除多級空目錄
- os.path.dirname(__ file __):獲取當前檔案所在的路徑(可以巢狀使用,則位上一層路徑)
- os.path.join(路徑1,路徑2):用於路徑拼接
- os.listdir(路徑):列舉出指定路徑下的檔名稱
- os.remove(檔名):刪除一個檔案
- os.rename(oldname,newname):修改檔名稱
- os.getcwd():獲取當前工作路徑
- os.chdir(路徑):切換路徑
- os.path.exists(檔名):判斷當前路徑是否存在
- os.path.isfile(檔案):判斷當前路徑是不是檔案
- os.path.isdir(資料夾):判斷當前路徑是否為資料夾
- os.path.getsize(檔名):獲取檔案內容大小,以下位元組數輸出
方法使用示例:
1、mkdir(資料夾)方法
建立單層目錄
import os
# 建立單層目錄
os.mkdir(r'HammerZe')
# 建立多層目錄報錯
os.mkdir(r'HammerZe\Ze')
2、makedirs(多級資料夾)方法
建立多層目錄
import os
# 建立多層目錄
os.makedirs(r'HammerZe\Ze')
3、rmdir(資料夾)方法
該方法只能刪除單級空目錄
import os
# 刪除單層目錄
os.rmdir(r'E:\Old_BoyClass_fourth\Ze')
'''Ze檔案是我提前建立好的'''
4、removedirs(多級資料夾)
該方法雖然能寫多層路徑,但是也只能刪除空目錄
import os
# 刪除單層目錄
os.removedirs(r'E:\Old_BoyClass_fourth\HammerZe')
5、os.path.dirname(__ file __)方法
獲取當前檔案路徑,可以巢狀使用返回上一層路徑
import os
# 獲取當前檔案所在路徑
print(os.path.dirname(__file__))
# >>>E:/Old_BoyClass_fourth
# 巢狀使用,獲取上一層路徑
print(os.path.dirname(os.path.dirname(__file__)))
# >>>E:/
6、os.path.join(路徑1,路徑2)
路徑拼接
import os
# 路徑拼接
# 獲取當前檔案路徑
now_dir = os.path.dirname(__file__)
print(now_dir) #E:/Old_BoyClass_fourth/join
# 路徑拼接,找到test.py檔案
join_dir = os.path.join(now_dir,'test.py')
print(join_dir)
# E:/Old_BoyClass_fourth/join\test.py
7、listdir(路徑)
列出指定目錄下的檔名稱,檔名以列表的形式組織返回
import os
# 顯示指定路徑下的檔名稱
find_dir = os.listdir(r'E:\Old_BoyClass_fourth\Mv')
print(find_dir)
'''a,b,c檔案我自己建的'''
# ['a.txt', 'b.txt', 'c.txt']
import os
# 進階練習:獲取指定目錄的檔案,選擇檔案可以進入
# 獲取當前檔案路徑
now_dir = os.path.dirname(__file__) # >>> E:/Old_BoyClass_fourth
# 拼接第一層
one_join = os.path.join(now_dir,r'E:\Old_BoyClass_fourth\Mv') # >>E:\Old_BoyClass_fourth\Mv
# 獲取指定目錄下的檔案
dir_list= os.listdir(r'E:\Old_BoyClass_fourth\Mv') # ['a.txt', 'b.txt', 'c.txt']
# 通過列舉的形式使得檔名由索引值
for index,values in enumerate(dir_list,1):
print(index,values)
# 獲取想要檢視的檔案序號
select_num = input('please input your select number>>>:').strip()
if select_num.isdigit():
select_num = int(select_num)
# 獲取檔案的索引不能超過檔案的個數
if select_num in range(len(dir_list)+1):
# 索引獲取對應的檔名稱
file_name = dir_list[select_num-1]
# 拼接檔案路徑,獲取a,b,c檔案的精確位置
dir_join = os.path.join(one_join,file_name)
# 讀取檔案
with open(dir_join,'r',encoding='utf8') as read_f:
print(read_f.read())
8、remove(檔名)
刪除一個檔案
import os
os.remove(r'E:\Old_BoyClass_fourth\Mv\drop.py')
9、rename(oldname,newname)
修改檔名
import os
os.rename('Mv','findtxt')
10、getcwd()
獲取當前工作路徑
import os
# 獲取當前工作路徑
print(os.getcwd()) # E:\Old_BoyClass_fourth
11、chdir(路徑)
切換路徑
import os
# 獲取當前工作路徑
print(os.getcwd()) # E:\Old_BoyClass_fourth
os.chdir('D:')
print(os.getcwd()) # D:\
12、os.path.exists(檔名)
判斷當前路徑是否存在
import os
# 存在的情況輸出True
print(os.path.exists(r'E:\Old_BoyClass_fourth\findtxt\a.txt'))
print(os.path.exists(r'E:\Old_BoyClass_fourth\findtxt\b.txt'))
# True
# True
# 不存在的情況輸出False
print(os.path.exists(r'E:\Old_BoyClass_fourth\findtxt\z.txt'))
# >>>False
13、os.path.isfile(檔案)
判斷是否為檔案
import os
# E:\Old_BoyClass_fourth\findtxt\a.txt'
print(os.path.isfile(r'E:\Old_BoyClass_fourth\findtxt\a.txt'))
print(os.path.isfile(r'E:\Old_BoyClass_fourth\findtxt'))
# True
# False
14、os.path.isdir(資料夾)
判斷是否為資料夾
import os
# E:\Old_BoyClass_fourth\findtxt\a.txt'
print(os.path.isdir(r'E:\Old_BoyClass_fourth\findtxt\a.txt'))
print(os.path.isdir(r'E:\Old_BoyClass_fourth\findtxt'))
# False
# True
15、os.path.getsize(檔名)
獲取檔案內容的大小,以位元組數輸出
import os
print(os.path.getsize(r'E:\Old_BoyClass_fourth\findtxt\a.txt'))
# a文字內容:a檔案
# 結果>>>7,a為一個位元組,檔案為六個位元組
3、sys模組
- sys.path:獲取指定模組搜尋路徑的字串集合,可以將寫好的模組放在得到的某個路徑下,就可以在程式中import時正確找到,也可以自定義新增模組路徑(重點)
- sys.path.append(路徑)
- sys.version:獲取版本號
- sys.platfotm:獲取當前系統平臺
- sys.argv:獲取當前執行檔案的絕對路徑(重點)
1、sys.path、sys.version、sys.platfotm
import sys
print(sys.path)
print(sys.version)
# 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)]
print(sys.platform)
# win32
sys.path在自定義模組中講過~
2、sys.argv[ ]
- sys.argv其實就是一個列表,裡邊的項為使用者輸入的引數,關鍵就是要明白這引數是從程式外部輸入的,而非程式碼本身的什麼地方,要想看到它的效果就應該將程式儲存了,從外部來執行程式並給出引數。(定義總結參考[arg]([Python中 sys.argv]的用法簡明解釋 - 覆手為雲p - 部落格園 (cnblogs.com)))
arg不跟[ ]返回的是檔案的絕對路徑
import sys
print(sys.argv) # >>>['E:/Old_BoyClass_fourth/test.py']
arg跟[]就是從外部獲取引數,來返回一個列表,開啟cmd執行py檔案演示:
import sys
print(sys.argv) # >>>['E:/Old_BoyClass_fourth/test.py']
index_v = sys.argv[1]
print(index_v)
新增一個argv[2]:
import sys
print(sys.argv) # >>>['E:/Old_BoyClass_fourth/test.py']
index_v = sys.argv[1]
index_v2 = sys.argv[2]
print(index_v,index_v2)
動態演示:
import sys
index_v = sys.argv[1]
index_v2 = sys.argv[2:]
print(index_v,index_v2)
4、json模組
在不同的程式語言中怎麼可以無障礙傳輸,中間這個“翻譯官”誰來做,比如在python中的列表,到js中就變成了陣列,這時候,json模組就可以做“翻譯官”,json模組的主要作用是用來跨語言傳輸
- json字串的標識就是雙引號,帶雙引號的字串為json字串
- 過程:
- 序列化:dumps()方法
- 反序列化:loads()方法
- jsom模組只支援部分資料型別序列化,如下:
Supports the following objects and types by default:
+-------------------+---------------+
| Python | JSON |
+===================+===============+
| dict | object |
+-------------------+---------------+
| list, tuple | array |
+-------------------+---------------+
| str | string |
+-------------------+---------------+
| int, float | number |
+-------------------+---------------+
| True | true |
+-------------------+---------------+
| False | false |
+-------------------+---------------+
| None | null |
+-------------------+---------------+
import json
dic = {'username': 'HammerZe', 'pwd': 123}
str_json = json.dumps(dic)
print(str_json)
# 序列化結果:{"username": "HammerZe", "pwd": 123}
dic_json = json.loads(str_json)
print(dic_json)
# 反序列化:{'username': 'HammerZe', 'pwd': 123}
# 檔案儲存
with open(r'E:\Old_BoyClass_fourth\findtxt\a.txt','w',encoding='utf8') as w_f:
str_json = json.dumps(dic)
w_f.write(str_json)
with open(r'E:\Old_BoyClass_fourth\findtxt\a.txt','r',encoding='utf8') as r_f:
res = r_f.read()
print(json.loads(res))
# 結果
{"username": "HammerZe", "pwd": 123}
{'username': 'HammerZe', 'pwd': 123}
{'username': 'HammerZe', 'pwd': 123}
- dump(序列化物件,檔案)
- load(序列化物件,檔案)
這兩個方法是對dumps和loads的簡寫,實現將字典序列化寫入檔案和反序列化取出
import json
dic = {'username': 'HammerZe', 'pwd': 123}
# 檔案儲存
with open(r'E:\Old_BoyClass_fourth\findtxt\a.txt','w',encoding='utf8') as w_f:
seq_str = json.dump(dic,w_f)
with open(r'E:\Old_BoyClass_fourth\findtxt\a.txt','r',encoding='utf8') as r_f:
nonseq_str = json.load(r_f)
print(nonseq_str)
# 結果
# {'username': 'HammerZe', 'pwd': 123}
5、subprocess模組
此模組可以基於網路連線上一臺計算機,讓連線上的計算機執行我們需要執行的命令,最後將命令結果返回
- cmd檢視當前正在執行的命令
- 在pycharm中使用問win終端的命令
import subprocess
# 當前系統中正在執行的程序
res = subprocess.Popen('tasklist',
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
print('stdout',res.stdout.read().decode('gbk')) # 獲取正確命令執行之後的結果
print('stderr',res.stderr.read().decode('gbk'))
'''windows電腦內部編碼預設為GBK'''