1. 程式人生 > 其它 >海賊王になる男です。常用模組之random,os,sys,json,subprocess

海賊王になる男です。常用模組之random,os,sys,json,subprocess

目錄

今日內容概要

  • random模組
  • os模組
  • sys模組
  • 序列化模組
  • subprocess模組

內容詳細

random隨機數模組

import random

# 隨機產生一個0-1之間的小數
print(random.random())  # 0.10115890219539025

# 隨機產生一個1-6之間的整數(擲骰子)
print(random.randint(1, 6))  # 4

# 隨機產生一個1-6之間的小數
print(random.uniform(1,6))  # 2.887746768640004

# 隨機抽取一個樣板
print(random.choice(['特等獎', '一等獎', '二等獎', '謝謝惠顧', '驚喜大獎之如花抱回家']))  # 二等獎

# 隨機抽取指定樣本量
print(random.sample(['安徽省', '江蘇省', '山東省', '海南省', '廣東省', '臺灣省'], 3))  # ['山東省', '海南省', '安徽省']

# 隨機打亂容器型別中的諸多元素(洗牌)
l = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
random.shuffle(l)  
print(l)  # [3, 2, 5, 'J', 8, 'Q', 4, 7, 'A', 10, 'K', 9, 6]


# 搜狗公司筆試題
# 隨機驗證碼可以是由 數字 小寫字母 大小寫字母 任意組合
# 編寫能夠產生五位數的隨機驗證碼
'''ps:五位 每位都可以是三種情況之一'''
import random

def get_code(n):
    # 提前定義一個儲存驗證碼的變數
    code = ''
    # 由於需要產生五位 每一位的操作都是一樣的 所以肯定需要使用迴圈
    for i in range(n):
        # 隨機產生一個數字
        random_int = str(random.randint(0, 9))
        # 隨機產生一個大寫字母
        random_upper = chr(random.randint(65, 90))  # chr 把數字轉按照ASCLL碼錶轉成對應的字母
        # 隨機產生一個小寫字母
        random_lower = chr(random.randint(97, 122))
        # 隨機選取一個
        temp = random.choice([random_int, random_upper, random_lower])
        # 拼接到字串中
        code += temp
    return code

code1 = get_code(5)  # 獲取五位驗證碼
code2 = get_code(10)  # 獲取十位驗證碼
code3 = get_code(8)  # 獲取八位驗證碼
print(code1, code2, code3)  # sd5g7 PLc1lt32wm 7WcW301G

os模組

import os

# 1.建立單級目錄(資料夾)
os.mkdir('XXX老師精品課程集')
os.mkdir(r'xxx視訊合集\r老師視訊作品')  # 建立多層會報錯

# 2.建立多級目錄(資料夾)
os.makedirs(r'xxx視訊合集\r老師視訊作品\2021選集')

# 3.刪除空目錄(資料夾)
os.rmdir(r'XXX老師精品課程集')
os.removedirs(r'xxx視訊合集')  # 報錯 必須為空資料夾才可以刪除

# 4.獲取當前檔案所在的路徑(可以巢狀 則為上一層路徑)
BASE_DIR = os.path.dirname(__file__)
print(BASE_DIR)
BASE_DIR = os.path.dirname(os.path.dirname(__file__))  # 返回上一層

# 5.路徑拼接(******) 能夠自動識別不同作業系統分隔符問題
movie_dir = os.path.join(BASE_DIR, '老師教學視訊')

# 6.列舉出指定路徑下的檔名稱(任意型別檔案)
data_movie_list = os.listdir('E:/每日練習檔案/老師教學視訊')
while True:
    for i, j in enumerate(data_movie_list):
        print(i + 1, j)
    choice = input('請選擇你想要看的檔案編號>>>:').strip()
    if choice.isdigit():
        choice = int(choice)
        if choice in range(len(data_movie_list) + 1):
            # 獲取編號對應的檔名稱
            file_name = data_movie_list[choice - 1]
            # 拼接檔案的完整路徑(******)
            file_path = os.path.join(movie_dir, file_name)  # 專門用於路徑拼接 並且能夠自動識別當前作業系統的路徑分隔符
            # 利用檔案操作讀寫檔案
            with open(file_path, 'r', encoding='utf8') as f:
                print(f.read())
                
# 7.刪除一個檔案
os.remove('a.txt')

# 8.修改檔名稱
os.rename('原始檔名','新檔名')

# 9.獲取當前工作路徑
print(os.getcwd())

# 10.切換路徑
os.chdir('D:/')
with open(r'a.txt','wb') as f:  # 可以在檔案操作時切換路徑
    pass

# 11.判斷當前路徑是否存在
print(os.path.exists('a.txt'))  
print(os.path.exists('老師教學視訊'))  
print(os.path.exists('...')) 

# 12.判斷當前路徑是否是檔案
print(os.path.isfile('老師教學視訊'))  
print(os.path.isfile('...'))  

# 13.判斷當前路徑是否是資料夾
print(os.path.isdir('01.py'))  # False
print(os.path.isdir('老師教學視訊'))  # True

# 14.獲取檔案大小(位元組數)
print(os.path.getsize(r'001.py'))

sys模組

import sys
# 主要與python直譯器打交道

print(sys.path)  # 獲取系統變數
print(sys.version)  # 當前直譯器版本
print(sys.platform)  # 當前計算機系統平臺版本
print(sys.argv)  # 獲取當前執行檔案的絕對路徑

try:
    username = sys.argv[1]
    password = sys.argv[2]
    if username == 'jason' and password == '123':
        print('正常執行檔案內容')
    else:
        print('使用者名稱或密碼錯誤')
except Exception:
    print('請輸入使用者名稱和密碼')

序列化模組(json)

import json
# json格式資料 用於跨語言傳輸

d = {'username': 'jason', 'pwd': 123}

# 1.將python其他資料轉換成json格式字串(序列化)
res = json.dumps(d)  # python中的字典轉換成json格式字串
print(res, type(res))  # {"username": "jason", "pwd": 123} <class 'str'>

# 2.將json格式字串轉成當前語言對應的某個資料型別(反序列化)
res1 = json.loads(res)  # 轉回python語言中的字典型別
print(res1, type(res1))  # {'username': 'jason', 'pwd': 123} <class 'dict'>

bytes_data = b'{"username": "jason", "pwd": 123}'
bytes_str = bytes_data.decode('utf8')  # 先把其他語言的資料解碼成json格式字串
bytes_dict = json.loads(bytes_str)  # json格式字串轉成python語言的字典型別
print(bytes_dict, type(bytes_dict))  # {'username': 'jason', 'pwd': 123} <class 'dict'>

"""
簡單理解:
	序列化就是將其他資料型別轉成字串的過程
		json.dumps()
	
	反序列化就是將字串型別轉成其他資料型別
		json.loads()
"""

d = {'username': 'jason', 'pwd': 123}

# 將字典d寫入檔案(常規寫法 但錯誤)
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write(str(d))  # 寫入文字檔案只能是字串型別
# 將字典d取出來
with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read()
print(dict(data))  # 取出的資料為字串型別 無法轉回字典讀取 直接報錯


# 將字典d寫入檔案(通過json模組轉換實現)
with open(r'a.txt', 'w', encoding='utf8') as f:
    res = json.dumps(d)  # 將字典序列化成json格式字串再寫入
    f.write(res)
# 將字典d取出來
with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read()
res1 = json.loads(data)  # 將json格式字串轉成當前語言的字典資料型別(反序列化)
print(res1, type(res1))  # {'username': 'jason', 'pwd': 123} <class 'dict'>


# dump load 使用達到同樣效果
d1 = {'username': 'tony', 'pwd': 123, 'hobby': [11, 22, 33]}
with open(r'a.txt', 'w', encoding='utf8') as f:
    json.dump(d1, f)
with open(r'a.txt', 'r', encoding='utf8') as f:
    res = json.load(f)
print(res, type(res))


# 文字內容含有漢字 需要指定直譯器不操作ASCLL碼轉換 才可以正常顯示漢字
d1 = {'username': 'tony好帥哦 我好喜歡', 'pwd': 123,'hobby':[11,22,33]}
print(json.dumps(d1,ensure_ascii=False))  # {"username": "tony好帥哦 我好喜歡", "pwd": 123, "hobby": [11, 22, 33]}

"""
不是所有的資料型別都支援序列化
json.JSONEncoder 檢視支援的資料型別
"""

subprocess模組

import subprocess

"""
1.可以基於網路連線上一臺計算機(socket模組)
2.讓連線上的計算機執行我們要求執行的命令
3.將命令的結果返回
"""

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