碰到一个python小例程的网站(也有相关的python教程),随便找了两个例程翻译了下,标题为英文原文链接。
为了理解下面的内容,你需要如下的python编程基础知识:
得到文件的哈希值
哈希函数(又称散列函数)接受任意数量的数据并返回固定长度的位串。函数的输出称为摘要消息(digest message)。
它们广泛地用于加密认证信息。有许多散列函数,如MD5,SHA-1等。参考此页面了解更多关于加密散列函数。
在这个例子中,我们将演示如何哈希文件。我们将使用SHA-1散列算法。 SHA-1产生的摘要是160位长。
我们不会一次性提取全部文件数据,因为一些文件非常大,会很消耗内存甚至一次性放不下。将文件分割成小块读取将使处理过程高效地使用内存。
代码-获取散列值
# Python程序-获取一个文件的SHA-1摘要信息
# 引入hashlib模块
import hashlib
def hash_file(filename):
"""该函数返回传入文件的SHA-1哈希值"""
# 创建一个哈希对象
h = hashlib.sha1()
# 以二进制读取模式打开一个文件
with open(filename,'rb') as file:
# 循环直到文件结束
chunk = 0
while chunk != b'':
# read only 1024 bytes at a time
chunk = file.read(1024)
h.update(chunk)
# 返回摘要的十六进制表示
return h.hexdigest()
message = hash_file("1.gif")
print(message)
输出
47d53886c16766d41ce4094cba433e91dc853d57
在这个程序中,我们从hashlib模块中获取哈希函数,以二进制模式打开文件。我们使用while循环读取直到文件结束——文件结束时,我们读取到空字节对象。
在每次迭代中,我们只从文件中读取1024字节(这个值可以根据我们的愿望改变),并更新散列函数。
最后,我们使用hexdigest()
方法返回十六进制表示的摘要消息。
得到图像的大小(分辨率)
实际上使用Pillow库可以方便地获得图像信息,而且这个例程还有些问题,图像的长宽字节的所在位置并不是固定的,而是有另一套规则,不过也可以用来学习下文件和位操作。
JPEG(Joint Photographic Experts Group)是图像压缩中使用最广泛的压缩技术之一。
大多数文件格式具有 包含关于文件的有用信息的 标头(最初几个字节)。
例如,jpeg文件头包含高度,宽度,颜色数量(灰度或RGB)等信息。在这个程序中,我们不使用任何外部库,通过读取jpeg文件头来获取该图片的分辨率。
代码-获取图片分辨率
def jpeg_res(filename):
"""该函数打印出传入图片的分辨率"""
# 以二进制读取模式打开图片
with open(filename,'rb') as img_file:
# 图片高度 (2个字节) 在第164位
img_file.seek(163)
# 读取两个字节
a = img_file.read(2)
# 计算高度
height = (a[0] << 8) + a[1]
# 之后两个字节为宽度
a = img_file.read(2)
# 计算宽度
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
在这个程序中,我们以二进制模式打开图像。非文本文件必须在此模式下打开。图像的高度位于第164位,紧跟着的是图像的宽度。两者都是2字节长。
注意,这仅适用于JPEG文件交换格式(JFIF)标准。如果你的图像是使用其他标准(如EXIF)编码,代码将失效。
我们使用按位移位算符<<将2个字节转换为一个数字(将头一个字节左移8位再加上第二个字节)。最后,显示分辨率。
网友评论