1. 程式人生 > 其它 >python 內建模組續寫

python 內建模組續寫

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'''