碰到一個python小例程的網(wǎng)站(也有相關(guān)的python教程),隨便找了兩個例程翻譯了下,標(biāo)題為英文原文鏈接。
為了理解下面的內(nèi)容,你需要如下的python編程基礎(chǔ)知識:
得到文件的哈希值

哈希函數(shù)(又稱散列函數(shù))接受任意數(shù)量的數(shù)據(jù)并返回固定長度的位串。函數(shù)的輸出稱為摘要消息(digest message)。
它們廣泛地用于加密認(rèn)證信息。有許多散列函數(shù),如MD5,SHA-1等。參考此頁面了解更多關(guān)于加密散列函數(shù)。
在這個例子中,我們將演示如何哈希文件。我們將使用SHA-1散列算法。 SHA-1產(chǎn)生的摘要是160位長。
我們不會一次性提取全部文件數(shù)據(jù),因?yàn)橐恍┪募浅4?,會很消耗?nèi)存甚至一次性放不下。將文件分割成小塊讀取將使處理過程高效地使用內(nèi)存。
代碼-獲取散列值
# Python程序-獲取一個文件的SHA-1摘要信息
# 引入hashlib模塊
import hashlib
def hash_file(filename):
"""該函數(shù)返回傳入文件的SHA-1哈希值"""
# 創(chuàng)建一個哈希對象
h = hashlib.sha1()
# 以二進(jìn)制讀取模式打開一個文件
with open(filename,'rb') as file:
# 循環(huán)直到文件結(jié)束
chunk = 0
while chunk != b'':
# read only 1024 bytes at a time
chunk = file.read(1024)
h.update(chunk)
# 返回摘要的十六進(jìn)制表示
return h.hexdigest()
message = hash_file("1.gif")
print(message)
輸出
47d53886c16766d41ce4094cba433e91dc853d57
在這個程序中,我們從hashlib模塊中獲取哈希函數(shù),以二進(jìn)制模式打開文件。我們使用while循環(huán)讀取直到文件結(jié)束——文件結(jié)束時,我們讀取到空字節(jié)對象。
在每次迭代中,我們只從文件中讀取1024字節(jié)(這個值可以根據(jù)我們的愿望改變),并更新散列函數(shù)。
最后,我們使用hexdigest()方法返回十六進(jìn)制表示的摘要消息。
得到圖像的大?。ǚ直媛剩?/a>
實(shí)際上使用Pillow庫可以方便地獲得圖像信息,而且這個例程還有些問題,圖像的長寬字節(jié)的所在位置并不是固定的,而是有另一套規(guī)則,不過也可以用來學(xué)習(xí)下文件和位操作。

JPEG(Joint Photographic Experts Group)是圖像壓縮中使用最廣泛的壓縮技術(shù)之一。
大多數(shù)文件格式具有 包含關(guān)于文件的有用信息的 標(biāo)頭(最初幾個字節(jié))。
例如,jpeg文件頭包含高度,寬度,顏色數(shù)量(灰度或RGB)等信息。在這個程序中,我們不使用任何外部庫,通過讀取jpeg文件頭來獲取該圖片的分辨率。
代碼-獲取圖片分辨率
def jpeg_res(filename):
"""該函數(shù)打印出傳入圖片的分辨率"""
# 以二進(jìn)制讀取模式打開圖片
with open(filename,'rb') as img_file:
# 圖片高度 (2個字節(jié)) 在第164位
img_file.seek(163)
# 讀取兩個字節(jié)
a = img_file.read(2)
# 計(jì)算高度
height = (a[0] << 8) + a[1]
# 之后兩個字節(jié)為寬度
a = img_file.read(2)
# 計(jì)算寬度
width = (a[0] << 8) + a[1]
print("The resolution of the image is",width,"x",height)
jpeg_res("img1.jpg")
輸出
The resolution of the image is 280 x 280
在這個程序中,我們以二進(jìn)制模式打開圖像。非文本文件必須在此模式下打開。圖像的高度位于第164位,緊跟著的是圖像的寬度。兩者都是2字節(jié)長。
注意,這僅適用于JPEG文件交換格式(JFIF)標(biāo)準(zhǔn)。如果你的圖像是使用其他標(biāo)準(zhǔn)(如EXIF)編碼,代碼將失效。
我們使用按位移位算符<<將2個字節(jié)轉(zhuǎn)換為一個數(shù)字(將頭一個字節(jié)左移8位再加上第二個字節(jié))。最后,顯示分辨率。