1. 程式人生 > >python---基礎知識回顧(四)(模塊sys,os,random,hashlib,re,json,xml,shutil,configparser,logging,datetime,time,集合,堆,雙端隊列,其他)

python---基礎知識回顧(四)(模塊sys,os,random,hashlib,re,json,xml,shutil,configparser,logging,datetime,time,集合,堆,雙端隊列,其他)

ID 正常 空值 字符 預測 platform OS normal 生成

前提: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
, _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 for
x in dir(copy) if not x.startswith(_)] [Error, PyStringMap, builtins, copy, deepcopy, dispatch_table, erro r, name, t, weakref]
View Code

__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 modules __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,ag1
View 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
errfawfa
View 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 50565
View 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
ba
>>> b = bytes("a你",encoding="utf-8")
>>> b
ba\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,集合,堆,雙端隊列,其他)