一、Pickle簡(jiǎn)介:
- 把數(shù)據(jù)寫(xiě)入文件時(shí),常規(guī)的文件方法只能把字符串對(duì)象寫(xiě)入盼产。其他數(shù)據(jù)需先轉(zhuǎn)換成字符串再寫(xiě)入文件
- Pickle可以將其他類型的數(shù)據(jù)寫(xiě)入文件,之后又可以把它完整無(wú)缺地取出來(lái)
補(bǔ)充:
- 常規(guī)方法寫(xiě)入數(shù)據(jù)灌灾,只能是字符串類型豌鸡,其他類型無(wú)法寫(xiě)入炉奴,例如:int赛糟,字典,列表等類型;
pickle模塊
可以在文件中存儲(chǔ)任何類型的數(shù)據(jù)对湃,也可以完整取出任何類型的數(shù)據(jù);
二拆讯、Pickle模塊常用函數(shù):
分類 |
關(guān)鍵字 / 函數(shù) / 方法 |
說(shuō)明 |
模塊 |
import pickle |
導(dǎo)入模塊 |
|
pickle.dump(dict,fw) |
將Python數(shù)據(jù)類型轉(zhuǎn)換為2進(jìn)制并保存到 pickle 格式的文件內(nèi)
dict :寫(xiě)入的文件地址
fw :寫(xiě)文件對(duì)象 |
|
pickle.load(dict) |
從pickle格式的文件中讀取數(shù)據(jù)并轉(zhuǎn)換為python的數(shù)據(jù)類型
dict :寫(xiě)入的文件地址 |
三爽室、使用示例
import pickle
# 將其他類型的數(shù)據(jù)寫(xiě)入文件
list01 = [1, 2, "213", "he", {213: "23", "sad": 23}]
with open("/opt/list.data", mode="wb") as fw:
pickle.dump(list01, fw)
with open("/opt/list.data", mode="rb") as fr:
list_data = pickle.load(fr)
print(list_data)
四、練習(xí):創(chuàng)建系統(tǒng)用戶
需求:
- 編寫(xiě)一個(gè)程序(函數(shù)),實(shí)現(xiàn)創(chuàng)建用戶的功能
- 提示用戶輸入 用戶名
- 隨機(jī)生成 8位密碼 (導(dǎo)入之前的模塊文件)
- 創(chuàng)建用戶并設(shè)置密碼
- 將用戶相關(guān)信息存儲(chǔ)文件內(nèi)忘苛,并打印
import pickle
import subprocess
import randpass as rp
def create_user(username, file_name):
result = subprocess.run(f'id {username} &> /dev/null', shell=True)
if result.returncode == 0:
print(f"用戶{username}已存在,請(qǐng)重新輸入驮俗!")
else:
# 隨機(jī)生成8位密碼
password = rp.get_pass()
print(f"您的用戶名:{username},您的密碼:{password}")
# 創(chuàng)建用戶
subprocess.run(f"useradd {username}", shell=True)
# 設(shè)置密碼
subprocess.run(f"echo {password} | passwd --stdin {username}", shell=True)
# 將用戶相關(guān)信息存儲(chǔ)文件
with open(file_name, mode="rb") as fr:
userdb = pickle.load(fr)
userdb[username] = password
with open(file_name, mode="wb") as fw:
pickle.dump(userdb, fw)
print("userdb:", userdb)
if __name__ == '__main__':
# 提示用戶輸入用戶名
user = input("輸入用戶名:\n")
create_user(user, "/opt/user_db")
import random as rd
from string import digits as dg, ascii_letters as al
# 隨機(jī)生成密碼
def get_pass(pass_number=8):
passwd = "" # 最終密碼
for item in range(pass_number):
# 密碼拼接
passwd += rd.choice(dg + al)
return passwd
if __name__ == '__main__':
print(get_pass())