1. 程式人生 > >python模塊(os,sys,hashlib,collections) 百日築基(四)

python模塊(os,sys,hashlib,collections) 百日築基(四)

pri 內置模塊 刪除元素 pre sha1 sdi 圖片 rename 固定

列出目錄下所有文件

os.listdir(‘dirname‘):列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式返回。

創建文件夾:

os.mkdir(‘文件夾‘) 創建文件夾

os.makedirs(‘文件夾1/文件夾2‘) 遞歸創建文件夾

刪除文件夾:

os.rmdir(‘文件夾路徑‘) 刪除文件夾(只能刪除空目錄,有文件不能刪除)

os.removedirs(‘文件夾路徑‘) 遞歸刪除到根目錄(只能刪除空目錄,目錄裏不能有文件)

和文件相關

os.remove() 刪除一個文件

os.rename("oldname","newname") 重命名文件/目錄

os.stat(‘path/filename‘) 獲取文件/目錄信息

和操作系統差異相關

os.sep 輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"

os.linesep 輸出當前平臺使用的行終止符,win下為"\r\n",Linux下為"\n"

os.pathsep 輸出用於分割文件路徑的字符串 win下為;,Linux下為:

os.name 輸出字符串指示當前使用平臺。win->‘nt‘; Linux->‘posix‘

和執行系統命令相關

os.system("bash command") 運行shell命令,直接顯示

os.popen("bash command).read() 運行shell命令,獲取執行結果

os.environ 獲取系統環境變量

?

path系列,和路徑相關

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) 獲取文件大小.對目錄不準

os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑

os.chdir("dirname") 切換目錄

os.curdir 返回當前目錄: (‘.‘)

os.pardir 獲取當前目錄的父目錄字符串名:(‘..‘)

sys模塊

sys.argv 命令行參數List,第一個元素是程序本身路徑

sys.exit(n) 退出程序,正常退出時exit(0),錯誤退出sys.exit(1)

sys.version 獲取Python解釋程序的版本信息

sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值

sys.platform 返回操作系統平臺名稱

hashlib模塊

摘要算法,摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。

摘要算法就是通過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest,目的是為了發現原始數據是否被人篡改過。

摘要算法之所以能指出數據是否被篡改過,就是因為摘要函數是一個單向函數,計算f(data)很容易,但通過digest反推data卻非常困難。而且,對原始數據做一個bit的修改,都會導致計算出的摘要完全不同。

我們以常見的摘要算法MD5為例,計算出一個字符串的MD5值:

import hashlib
md5 = hashlib.md5() # 創建_hashlib.HASH的對象
md5.update("md5".encode("utf-8")) # 字符串md5是要被加密的數據
md5_hex = md5.hexdigest() # 獲取md5加密後的數據
print(md5_hex)

# 打印內容如下
1bc29b36f623ba82aaf6724fd3b16718

如果數據量很大,可以分塊多次調用update(),最後計算的結果是一樣的:

MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示

另一種常見的摘要算法是SHA1,調用SHA1和調用MD5完全類似:

import hashlib
sha1 = hashlib.sha1()
sha1.update("sha1".encode("utf-8"))
sha1_hex = sha1.hexdigest()
print(sha1_hex)

# 打印內容如下
415ab40ae9b7cc4e66d6769cb2c08106e8293b48

SHA1的結果是160 bit字節,通常用一個40位的16進制字符串表示

SHA1的安全系數比MD5還要高一些,而且摘要的長度要比MD5長。

比SHA1更安全的算法是SHA256和SHA512,不過越安全的算法越慢,而且摘要長度更長。用法與SHA1一樣。

collections模塊

Python內置模塊,在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

1、namedtuple: 生成可以使用名字來訪問元素內容的tuple。

2、deque: 雙端隊列,可以快速的從頭或尾追加和刪除元素。

3、Counter: 計數器,主要用來計數。

4、OrderedDict: 有序字典。

5、defaultdict: 帶有默認值的字典。

namedtuple:命名元組。

我們知道元組是不可被修改的容器,如元組(10,2),單從這個元組的元素來看,我們不知道這個元組的元素到底表示的是什麽。它可以表示一對普通數字,亦可以表示一個坐標軸的兩個坐標,還可以表示10的2次冪等,為了解決這個問題namedtuple應運而生。下面是基礎示例:

我們假設(10,2)是一個坐標:

from collections import namedtuple
# 創建命名元組對象命名,並指定元組長度
point = namedtuple("point",["x","y"])
# 創建命名元組
tuple_1 = point(10,2)
# 以x,y的形式打印元素
print(tuple_1.x,tuple_1.y)

# 打印內容如下
10 2

下面以計算長方體體積為例:

from collections import namedtuple
# 創建命名元組對象命名,並指定元組長度
Cuboid = namedtuple("Cuboid",["len","width","height"])
# 創建命名元組
tuple_1 = Cuboid(10,8,6)
# 對比兩種打印方式我們就可以看出
# 第一種明顯比第二種打印方式更容易理解
print(tuple_1.len * tuple_1.width * tuple_1.height)
print(tuple_1[0] * tuple_1[1] * tuple_1[2])

# 打印內容如下
480
480

由上面的示例可以知道有時候利用命名元組引用元素的時候,我們可以更容易理解元素所表示的是什麽。這樣對代碼的理解會更好。

deque:雙端隊列

deque與列表類似都是線性存儲,但是隊列只支持在隊列的頭部和尾部追加和刪除元素,屬於列表的特殊版。在插入元素和刪除元素的效率上比列表更快。因為列表不僅可以在頭部和尾部追加和刪除元素,還可以在任意位置追加和刪除元素。每當列表刪除一個非頭部和尾部元素的時候,列表就要重新進行排序以保證列表的線性存儲。如下圖所示:

技術分享圖片

由上圖我們知道元素30對應的內存地址是3,刪除元素30後,為保證列表的線性,元素40和元素50內存地址都向前移了一位,元素40的內存地址由原來的4變成3,元素50的內存地址由原來的5變成4。如果把列表的第一個元素刪除了,後面的整個列表都會依次向前補齊位置。而雙端隊列不會,無論是刪除隊列的頭還是尾隊列的整體不會進行補位的操作。

from collections import deque
deque_list = deque([1,2,3,4])
deque_list.appendleft("a")  # 向頭部追加元素
deque_list.append("z")      # 向尾部追加元素
print("追加後的數據是:",deque_list)
deque_list.pop()  # 刪除尾部元素
deque_list.popleft()  # 刪除頭部元素
print("刪除後的數據是:",deque_list)

# 打印內容如下
追加後的數據是: deque([a, 1, 2, 3, 4, z])
刪除後的數據是: deque([1, 2, 3, 4])

OrderedDict:有序字典,有序字典是按照鍵插入順序進行排列的(Python3.X的字典是按著鍵插入順序進行排序的,Python2.X的字典鍵是按照ASCII表的順序進行排序。)

如下:Python2.7中進行測試。

dict_1 = {}
dict_1["z"] = 1
dict_1["c"] = 3
dict_1["a"] = 2
dict_od = OrderedDict()  # 有序字典
dict_od["z"] = 1
dict_od["c"] = 3
dict_od["a"] = 2
print(dict_1)
print(dict_od)  # 打印有序字典

# 打印內容如下
{a: 2, c: 3, z: 1}
OrderedDict([(z, 1), (c, 3), (a, 2)])

defaultdict:默認字典,我感覺這個還是有些用的。

1、如果默認字典的鍵不存在,不會報錯。

2、在定義默認字典時可以指定值的類型。

示例:將列表中大於3的元素保存到字典的“a”鍵中,將小於3的元素保存到字典的“b”鍵中。

如下:使用普通字典的方法。

list_1 = [1,2,3,4,5,6]
dict_1 = {}
for i in list_1:
    if i > 3:
        if "a" in dict_1:
            dict_1["a"].append(i)
        else:
            dict_1["a"] = [i]
    else:
        if "b" in dict_1:
            dict_1["b"].append(i)
        else:
            dict_1["b"] = [i]
print(dict_1)

# 打印內容如下
{b: [1, 2, 3], a: [4, 5, 6]}

如下:使用默認字典的方法。

from collections import defaultdict
list_1 = [1,2,3,4,5,6]
dict_d = defaultdict(list)  # 定義默認字典
for i in list_1:
    if i > 3:
        dict_d["a"].append(i)
    else:
        dict_d["b"].append(i)
print(dict_d)

# 打印內容如下
defaultdict(<class list>, {b: [1, 2, 3], a: [4, 5, 6]})

對比兩個代碼段可以發現使用默認字典的方式代碼更加簡潔,結構更加清晰明了。

Counter:統計可叠代對象中每個元素出現的次數。

from collections import Counter
list_1 = ["a","b","a",1,2,3,1]
print(Counter(list_1))

# 打印內容如下
Counter({a: 2, 1: 2, b: 1, 2: 1, 3: 1})

python模塊(os,sys,hashlib,collections) 百日築基(四)