python---基礎知識回顧(四)(模塊sys,os,random,hashlib,re,json,xml,shutil,configparser,logging,datetime,time,集合,堆,雙端隊列,其他)
前提:dir,__all__,help,__doc__,__file__
dir:可以用來查看模塊中的所有特性(函數,類,變量等)
>>> import copy >>> dir(copy) [‘Error‘, ‘PyStringMap‘, ‘_EmptyClass‘, ‘__all__‘, ‘__builtins__‘, ‘__cached__‘, ‘__doc__‘, ‘__file__‘, ‘__loader__‘, ‘__name__‘, ‘__package__‘, ‘__spec__‘, ‘_c opy_dispatch‘, ‘_copy_immutable‘View Code, ‘_copy_with_constructor‘, ‘_copy_with_copy_met hod‘, ‘_deepcopy_atomic‘, ‘_deepcopy_dict‘, ‘_deepcopy_dispatch‘, ‘_deepcopy_lis t‘, ‘_deepcopy_method‘, ‘_deepcopy_tuple‘, ‘_keep_alive‘, ‘_reconstruct‘, ‘built ins‘, ‘copy‘, ‘deepcopy‘, ‘dispatch_table‘, ‘error‘, ‘name‘, ‘t‘, ‘weakref‘] >>> [x forx in dir(copy) if not x.startswith(‘_‘)] [‘Error‘, ‘PyStringMap‘, ‘builtins‘, ‘copy‘, ‘deepcopy‘, ‘dispatch_table‘, ‘erro r‘, ‘name‘, ‘t‘, ‘weakref‘]
__all__:(dir中有這個變量)這個變量中包含了一個列表。和我們使用dir加上列表推導式相似。
>>> copy.__all__ [‘Error‘, ‘copy‘, ‘deepcopy‘]View Code
他定義了模塊的公有接口,或者說他告訴解釋器當我們使用
from copy import *
時,會導入模塊的那些函數方法。__all__在編寫模塊是,可以過濾掉大多不需要的函數方法。若是沒有__all__,使用import *會將除了以下劃線開頭的所有全局名稱導入
help:獲取幫助,提供日常需要的信息
>>> help(copy) Help on module copy: NAME copy - Generic (shallow and deep) copying operations. DESCRIPTION Interface summary: .... >>> help(copy.copy) Help on function copy in module copy: copy(x) Shallow copy operation on arbitrary Python objects. See the module‘s __doc__ string for more info.View Code
引用了__doc__特性,事實上是使用了文檔字符串(寫在模塊開頭,或者函數開頭的)
__file__:獲取文件位置:便於查看文件源代碼位置:
>>> copy.__file__ ‘C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35\\lib\\copy .py‘View Code
一.sys
sys.argv 命令行參數List,第一個元素是程序本身路徑
import sys args = sys.argv[1:] #默認0是程序名 args.reverse() print(‘,‘.join(args)) D:\MyPython\day24\基礎回顧\01裝飾器>python test.py ag1 ag2 ag3 ag3,ag2,ag1View Code
sys.exit(n) 退出程序,正常退出時exit(0)
>>> import sys
>>> sys.exit()
View Code
sys.version 獲取Python解釋程序的版本信息 #python --version
>>> sys.version ‘3.5.4 (v3.5.4:3f56838, Aug 8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)]‘View Code
sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
>>> sys.path [‘‘, ‘C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35\\pyth on35.zip‘, ‘C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35 \\DLLs‘, ‘C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35\lib‘, ‘C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35‘, ‘C :\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35\\lib\\site-p ackages‘]View Code
sys.platform 返回操作系統平臺名稱
>>> sys.platform ‘win32‘View Code
sys.stdin 輸入相關 有讀取屬性r 從屏幕中讀取
>>> var = sys.stdin.read() aasddsa ^Z >>> var ‘aasddsa\n‘ >>> var = sys.stdin.read(5) dsad >>> var ‘dsad\n‘ >>>View Code
sys.stdout 輸出相關 有寫入屬性w 向屏幕中寫入
>>> sys.stdout.write(‘dasf‘) dasf4 >>> sys.stdout.flush() #刷新當前屏幕 shell中無用View Code
sys.stderror 錯誤相關 有寫入屬性w 向屏幕寫入(會含有輸出錯誤信息的信息長度)
print(sys.stderr) print(sys.stderr.write("errfawfa")) <_io.TextIOWrapper name=‘<stderr>‘ mode=‘w‘ encoding=‘UTF-8‘> 8 errfawfaView Code
二,os
os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑 os.chdir("dirname") 改變當前腳本工作目錄;相當於shell下cd os.curdir 返回當前目錄: (‘.‘) os.pardir 獲取當前目錄的父目錄字符串名:(‘..‘) os.makedirs(‘dir1/dir2‘) 可生成多層遞歸目錄 os.removedirs(‘dirname1‘) 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推 os.mkdir(‘dirname‘) 生成單級目錄;相當於shell中mkdir dirname os.rmdir(‘dirname‘) 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname os.listdir(‘dirname‘) 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式打印 os.remove() 刪除一個文件 os.rename("oldname","new") 重命名文件/目錄 os.stat(‘path/filename‘) 獲取文件/目錄信息 os.sep 操作系統特定的路徑分隔符,win下為"\\",Linux下為"/" os.linesep 當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n" os.pathsep 用於分割文件路徑的字符串 os.name 字符串指示當前使用平臺。win->‘nt‘; Linux->‘posix‘
>>> sys.platform ‘win32‘ >>> os.name ‘nt‘View Code
os.system("bash command") 運行shell命令,直接顯示。用於運行外部程序
>>> os.system(‘ls -al‘) total 50565View Code
os.environ 獲取系統環境變量 在系統中高級環境變量Path設置中的數據
os.path.abspath(path) 返回path規範化的絕對路徑
os.path.split(path) 將path分割成目錄和文件名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素,就是返回上級目錄
>>> os.path.dirname("c:/sys") ‘c:/‘ >>> os.path.dirname("c:/sys/windows/1.txt") ‘c:/sys/windows‘View Code
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所指向的文件或者目錄的最後修改時間 是時間戳
三:random
該模塊包括返回隨機數的函數。可以用於模擬或者產生隨機輸出的程序。
>>> random.__all__ [‘Random‘, ‘seed‘, ‘random‘, ‘uniform‘, ‘randint‘, ‘choice‘, ‘sample‘, ‘randrang e‘, ‘shuffle‘, ‘normalvariate‘, ‘lognormvariate‘, ‘expovariate‘, ‘vonmisesvariat e‘, ‘gammavariate‘, ‘triangular‘, ‘gauss‘, ‘betavariate‘, ‘paretovariate‘, ‘weib ullvariate‘, ‘getstate‘, ‘setstate‘, ‘getrandbits‘, ‘SystemRandom‘]random.__all__
註意:事實上,所產生的數字都是偽隨機數,也就是說他們看起來是完全隨機的,實際上,他們是以一個可預測的系統作為基礎。不過,已經很不錯了。若是想實現真正的隨機可以使用os中的urandom或者random中的SystemRandom
>>> random.random() #返回一個在0-之間的隨機數 0.5134022843262868 >>> help(random.random) Help on built-in function random: random(...) method of random.Random instance random() -> x in the interval [0, 1). >>> random.randint(1,100) #返回一個在1,100之間的整數 20 >>> random.randrange(1,100) 80
四:hashlib
用於加密相關的操作,代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib
######### md5 ########
h2 = hashlib.md5() h2.update(bytes(‘123456‘, encoding=‘utf-8‘)) print(h2.hexdigest()) #是字符串十六進制 print(h2.digest()) #是字節byte型 通過.hex()可以轉換為上面的字符串十六進制
補充:
digest()
>>> help(hashlib._hashlib.HASH.digest) Help on method_descriptor: digest(...) Return the digest value as a string of binary data. 返回一個bytes 八位一字節(ASCII),對於(編碼的字符,若是ASCII中字符則直接顯示,否則按照編碼進行轉換)
b‘\xeaHWo0\xbe\x16i\x97\x16\x99\xc0\x9a\xd0\\\x94‘
對於bytes編碼的字符,若是ASCII中字符則直接顯示,否則按照編碼進行轉換
>>> b = bytes("a",encoding="utf-8") >>> b b‘a‘ >>> b = bytes("a你",encoding="utf-8") >>> b b‘a\xe4\xbd\xa0‘
hexdigest()
>>> help(hashlib._hashlib.HASH.hexdigest) Help on method_descriptor: hexdigest(...) Return the digest value as a string of hexadecimal digits. 返回一個十六進制字符串str類型
‘ea48576f30be1669971699c09ad05c94‘
-------------------------------------------------------------------------------------
digest()轉hexdigest()
>>> h2.digest().hex()
-------------------------------------------------------------------------------------
hexdigest()轉digest()
需要使用binascii模塊
>>> help(binascii) Help on built-in module binascii: NAME binascii - Conversion between binary data and ASCII
用於轉換 --- 在二進制和ASCII碼之間
binascii中a2b_hex
>>> help(binascii.a2b_hex) Help on built-in function a2b_hex in module binascii: a2b_hex(hexstr, /) Binary data of hexadecimal representation.
將十六進制字符串轉化為二進制用bytes類型顯示(ASCII) hexstr must contain an even number of hex digits (upper or lower case). This function is also available as "unhexlify()".
其中十六進制必須是偶數
一般我們直接使用十六進制字符串,直接是32位字符串
轉換成功:
>>> binascii.a2b_hex(h2.hexdigest()) b‘\xeaHWo0\xbe\x16i\x97\x16\x99\xc0\x9a\xd0\\\x94‘ >>> h2.digest() b‘\xeaHWo0\xbe\x16i\x97\x16\x99\xc0\x9a\xd0\\\x94‘ >>> h2.hexdigest() ‘ea48576f30be1669971699c09ad05c94‘ >>> binascii.a2b_hex(h2.hexdigest()) b‘\xeaHWo0\xbe\x16i\x97\x16\x99\xc0\x9a\xd0\\\x94‘
-------------------------------------------------------------------------------------
其中md5算法時不能被反解的,但是可以被撞庫,獲取密碼。
更加安全的方法是在加密算法中添加自定義key再來進行加密:
沒有key時:
>>> h1 = hashlib.md5(bytes("123456",encoding="utf-8")) >>> h1.hexdigest() ‘e10adc3949ba59abbe56e057f20f883e‘
上面的數據很容易被撞庫獲取出來密碼。尤其是這些簡單的
-------------------------------------------------------------------------------------
使用自定義key時
>>> h2 = hashlib.md5(bytes("asd",encoding="utf-8")) >>> h2.update(bytes("123456",encoding="utf-8")) >>> h2.hexdigest() ‘1e55dbf412cb74d5e2c21fb6452408c7‘
相當於使用兩次update:
>>> h3 = hashlib.md5() >>> h3.update(byte("asd",encoding="utf-8")) >>> h3.update(bytes("123456",encoding="utf-8")) >>> h3.hexdigest() ‘1e55dbf412cb74d5e2c21fb6452408c7‘
-------------------------------------------------------------------------------------
######## sha1 ########(這些算法的使用和md5相似)
h = hashlib.sha1() h.update(bytes(‘123456‘, encoding=‘utf-8‘)) print(h.hexdigest())
SHA1, SHA224, SHA256, SHA384, SHA512使用時一樣的
-------------------------------------------------------------------------------------
python內置還有一個 hmac 模塊,它內部對我們創建 key 和 內容 進行進一步的處理然後再加密
import hmac h = hmac.new(bytes(‘asd‘,encoding="utf-8")) h.update(bytes(‘123456‘,encoding="utf-8")) print(h.hexdigest())
#548b23c538c78d7053e3231919f78f36 與上面自定義key得出的密碼不一樣,說明在內部對key和內容又進行了處理
五:re正則模塊
基礎了解:正則表達式了解
python---基礎知識回顧(四)(模塊sys,os,random,hashlib,re,json,xml,shutil,configparser,logging,datetime,time,集合,堆,雙端隊列,其他)