1. 程式人生 > 其它 >第17天 hash模組 subprocess模組 os模組 sys模組 configparser模組

第17天 hash模組 subprocess模組 os模組 sys模組 configparser模組

技術標籤:python

模組的應用場景:
hash模組:主要應用於檔案加密或者校驗檔案的完整性
subprocess:主要用來執行作業系統命令,匯入subprocess可以理解成匯入cmd
os模組:主要應用於環境變數,檔案目錄
sys:主要記住sys.path,sys.argv
configparser:讀取修改固定格式的配置檔案,配置檔案的字尾是ini或者cnf

hash演算法的三大特點
如果傳入一段內容,會得到一串hash值,hash值有三大特點
1.如果傳入的內容與採用的演算法一樣,那麼得到的hash值一定一樣
2.只有採用的演算法是固定的,hash值的長度是固定的,不會隨著內容的增長而變長

3.hash值不可逆,不能通過hash值反解出內容是什麼
1+2==>可以用來校驗檔案的完整性
1+3==>可以用來加密
注意:往hash工廠裡面傳值,必須傳bytes型別的值
在這裡插入圖片描述
用hash演算法得到hash值

import hashlib

m = hashlib.md5()  # md5是最簡單的一種hash演算法,呼叫md5會得到一個返回值,m就是hash工廠(還有一些其他的演算法,比如512演算法會讓hash值的複雜程度變高)
m.update("你好".encode("utf-8"))     #往hash工廠m裡面傳值
m.update
("nana".encode("utf-8")) m.update("哈哈".encode("utf-8")) # 以上傳輸方式是分批次md5裡面傳值,傳值的結果是:你好nana哈哈 print(m.hexdigest()) #最後得到的hash值:118d65c2111c3c6c357f2041403fccca

用hash演算法校驗檔案的完整性

import hashlib

m = hashlib.md5()
with open(r"D:\pycharm檔案\test\practice\c.txt"
, mode="rb")as f: for line in f: m.update(line) res = m.hexdigest() print(res) # 把hash值和檔案一起傳給客戶端,hash值為:c2ad1c51f02542950e58666460070f2f

用hash演算法加密檔案

import hashlib

m = hashlib.md5()
password = "123nana"
m.update(password.encode("utf-8"))
m.update("娜娜".encode("utf-8"))
print(m.hexdigest())

subprocess模組

subprocess主要用來執行作業系統命令,匯入subprocess可以理解成匯入windows系統的cmd

import subprocess
import time

obj = subprocess.Popen("tasklist",  # subprocess.Popen開啟了一個子程序,sleep後才再pycharm顯示結果是因為兩個程序共用一個終端
                       shell=True,
                       stdout=subprocess.PIPE,  # 兩個程序之間的記憶體空間是不共享的,主程序想取子程序的結果,使用“管道”可以實現記憶體共享
                       stderr=subprocess.PIPE
                       )

# time.sleep(3)

stdout_res = obj.stdout.read()  # 該管道調正確的結果
stderr_res = obj.stderr.read()  # 該管道調錯誤的結果

print(stdout_res.decode("gbk"))  # windows系統解碼時gbk格式

os模組

os模組是與作業系統互動的一個介面:

os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑
os.chdir(“dirname”) 改變當前指令碼工作目錄;相當於shell下cd
os.curdir 返回當前目錄: (’.’)
os.pardir 獲取當前目錄的父目錄字串名:(’…’)
os.makedirs(‘dirname1/dirname2’) 可生成多層遞迴目錄
os.removedirs(‘dirname1’) 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir(‘dirname’) 生成單級目錄;相當於shell中mkdir dirname
os.rmdir(‘dirname’) 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir(‘dirname’) 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印
os.remove() 刪除一個檔案
os.rename(“oldname”,“newname”) 重新命名檔案/目錄
os.stat(‘path/filename’) 獲取檔案/目錄資訊
os.sep 輸出作業系統特定的路徑分隔符,win下為"\",Linux下為"/"
os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用於分割檔案路徑的字串 win下為;,Linux下為:
os.name 輸出字串指示當前使用平臺。win->‘nt’; Linux->‘posix’
os.system(“bash command”) 執行shell命令,直接顯示
os.environ 獲取系統環境變數
os.path.abspath(path) 返回path規範化的絕對路徑
os.path.split(path) 將path分割成目錄和檔名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對路徑,返回True
os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False
os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, …]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略
os.path.getatime(path) 返回path所指向的檔案或者目錄的最後存取時間
os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間
os.path.getsize(path) 返回path的大小

import os

print(os.getcwd())
os.environ["name"] = "nana"         #儲存成字典型別,匯入os模組直接使用,可以規避迴圈匯入模組的問題
print(os.environ["name"])

os模組path功能的使用
print(os.path.abspath(r"a.txt"))  # 相對路徑轉成絕對路徑  #D:\pycharm檔案\test\practice\a.txt
print(os.path.split(r"D:\pycharm檔案\test\practice\a.txt"))  # ('D:\\pycharm檔案\\test\\practice', 'a.txt')
print(os.path.dirname(r"D:\pycharm檔案\test\practice\a.txt"))  # D:\pycharm檔案\test\practice
print(os.path.basename(r"D:\pycharm檔案\test\practice\a.txt"))  # a.txt
print(os.path.exists(r"D:\pycharm檔案\test\practice\a.txt"))   #如果path存在,返回True;如果path不存在,返回False
print(os.path.isabs(r"D:\pycharm檔案\test\practice\a.txt"))  # 如果path是絕對路徑,返回True
print(os.path.isfile(r"D:\pycharm檔案\test\practice\a.txt"))  # 如果path是一個存在的檔案,返回True。否則返回False
print(os.path.isdir(r"D:\pycharm檔案\test\practice\a.txt"))  # 如果path是一個存在的目錄,則返回True。否則返回False
print(os.path.join("D", "a", "b", "c"))    #幫忙拼接路徑D\a\b\c
print(os.path.getatime(r"D:\pycharm檔案\test\practice\a.txt"))  # 返回path所指向的檔案或者目錄的最後存取時間
print(os.path.getatime(r"D:\pycharm檔案\test\practice\a.txt"))  # 返回path所指向的檔案或者目錄的最後修改時間
print(os.path.getsize(r"D:\pycharm檔案\test\practice\a.txt"))  # 返回path的大小

sys模組

1 sys.argv 命令列引數List,第一個元素是程式本身路徑
2 sys.exit(n) 退出程式,正常退出時exit(0)
3 sys.version 獲取Python解釋程式的版本資訊
4 sys.maxint 最大的Int值
5 sys.path 返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
6 sys.platform 返回作業系統平臺名稱

用sys.argv實現拷貝終端的檔案內容
import sys

scr_file = sys.argv[1]  # 原檔案
dst_file = sys.argv[2]  # 目標檔案
with open(r"%s" % scr_file, mode="rb")as f1, \
        open(r"%s" % dst_file, mode="wb")as f2:
    for line in f1:
        f2.write(line)

configparser模組
讀取修改固定格式的配置檔案,配置檔案的字尾是ini或者cnf

讀取
import configparser

config = configparser.ConfigParser()
config.read('a.cfg')

# 檢視所有的標題
res = config.sections()  # ['section1', 'section2']
print(res)

# 檢視標題section1下所有key=value的key
options = config.options('section1')
print(options)  # ['k1', 'k2', 'user', 'age', 'is_admin', 'salary']

# 檢視標題section1下所有key=value的(key,value)格式
item_list = config.items('section1')
print(item_list)  # [('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]

# 檢視標題section1下user的值=>字串格式
val = config.get('section1', 'user')
print(val)  # egon

# 檢視標題section1下age的值=>整數格式
val1 = config.getint('section1', 'age')
print(val1)  # 18

# 檢視標題section1下is_admin的值=>布林值格式
val2 = config.getboolean('section1', 'is_admin')
print(val2)  # True

# 檢視標題section1下salary的值=>浮點型格式
val3 = config.getfloat('section1', 'salary')
print(val3)  # 31.0
改寫
import configparser

config = configparser.ConfigParser()
config.read('a.cfg', encoding='utf-8')

# 刪除整個標題section2
config.remove_section('section2')

# 刪除標題section1下的某個k1和k2
config.remove_option('section1', 'k1')
config.remove_option('section1', 'k2')

# 判斷是否存在某個標題
print(config.has_section('section1'))

# 判斷標題section1下是否有user
print(config.has_option('section1', ''))

# 新增一個標題
config.add_section('egon')

# 在標題egon下新增name=egon,age=18的配置
config.set('egon', 'name', 'egon')
config.set('egon', 'age', 18)  # 報錯,必須是字串

# 最後將修改的內容寫入檔案,完成最終的修改
config.write(open('a.cfg', 'w'))