一、Pickle簡介:
- 把數(shù)據(jù)寫入文件時(shí),常規(guī)的文件方法只能把字符串對(duì)象寫入。其他數(shù)據(jù)需先轉(zhuǎn)換成字符串再寫入文件
- Pickle可以將其他類型的數(shù)據(jù)寫入文件,之后又可以把它完整無缺地取出來
補(bǔ)充:
- 常規(guī)方法寫入數(shù)據(jù),只能是字符串類型,其他類型無法寫入,例如:int,字典,列表等類型;
pickle模塊
可以在文件中存儲(chǔ)任何類型的數(shù)據(jù),也可以完整取出任何類型的數(shù)據(jù);
二、Pickle模塊常用函數(shù):
分類 |
關(guān)鍵字 / 函數(shù) / 方法 |
說明 |
模塊 |
import pickle |
導(dǎo)入模塊 |
|
pickle.dump(dict,fw) |
將Python數(shù)據(jù)類型轉(zhuǎn)換為2進(jìn)制并保存到 pickle 格式的文件內(nèi)
dict :寫入的文件地址
fw :寫文件對(duì)象 |
|
pickle.load(dict) |
從pickle格式的文件中讀取數(shù)據(jù)并轉(zhuǎn)換為python的數(shù)據(jù)類型
dict :寫入的文件地址 |
三、使用示例
import pickle
# 將其他類型的數(shù)據(jù)寫入文件
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)用戶
需求:
- 編寫一個(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())