Python进阶教程m18–文件属性、文件摘要

原文链接:http://www.juzicode.com/python-tutorial-file-attribute-digest

1、文件大小、时间

文件的大小,修改时间、访问时间、创建时间需要使用到os.stat()方法,该方法返回一个 os.stat_result 的实例,该实例的st_mtime、 st_atime、st_ctime等属性表示文件的修改时间、访问文件、创建时间等。

#juzicode.com / VX:桔子code
import time
import os
filename = 'lena.jpg'
fa = os.stat(filename)
print('type fa:',type(fa))
print('fa:',fa)
print('fa.st_mtime:',fa.st_mtime) 
print('fa.st_atime:',fa.st_atime) 
print('fa.st_ctime:',fa.st_ctime)
print('fa.st_size:',fa.st_size)  
print('fa.st_file_attributes:',fa.st_file_attributes)   

运行结果:

type fa: <class 'os.stat_result'>
fa: os.stat_result(st_mode=33206, st_ino=844424930139442, st_dev=1254643550, st_nlink=1, st_uid=0, st_gid=0, st_size=91814, st_atime=1653837972, st_mtime=1519317512, st_ctime=1652548643)
fa.st_mtime: 1519317512.0
fa.st_atime: 1653837972.0751934
fa.st_ctime: 1652548643.6513824
fa.st_size: 91814
fa.st_file_attributes: 32

上述mtime等数值表示从1970-1-1 0:0:0UTC开始的秒数,下面的方法可以进一步将其转换为可读格式:

ts = time.localtime(fa.st_mtime)
ts_str = time.strftime('fa.st_mtime:%Y-%m-%d,%H:%M:%S',ts)
print(ts_str)
ts = time.localtime(fa.st_atime)
ts_str = time.strftime('fa.st_atime:%Y-%m-%d,%H:%M:%S',ts)
print(ts_str)
ts = time.localtime(fa.st_ctime)
ts_str = time.strftime('fa.st_ctime:%Y-%m-%d,%H:%M:%S',ts)
print(ts_str)

运行结果:

fa.st_mtime:2018-02-23,00:38:32
fa.st_atime:2022-05-29,23:26:12
fa.st_ctime:2022-05-15,01:17:23

2、hash码计算

可以使用hashlib模块计算文件的hash码,hashlib中可以计算sha1,sha256,sha384,sha512等hash码。

使用的方法如下,这里以sha1为例,第一种方法用sha1()方法创建一个实例,在创建时传入要计算的数据,然后用hexdigest()或digest()返回其摘要值。

#juzicode.com / VX:桔子code
import hashlib
sha = hashlib.sha1(b'abcdefghijklmnopqrstuvwxyz')
print('type sha:',type(sha))
print('sha:',sha)
print('type hexdigest:',type(sha.hexdigest()))
print('sha:',sha.hexdigest())
print('type digest:',type(sha.digest()))
print('sha:',sha.digest())

运行结果:

type sha: <class '_hashlib.HASH'>
sha: <sha1 HASH object @ 0x000002A28EEA79B0>
type hexdigest: <class 'str'>
sha: 32d10c7b8cf96570ca04ce37f2a19d84240d3a89
type digest: <class 'bytes'>
sha: b'2\xd1\x0c{\x8c\xf9ep\xca\x04\xce7\xf2\xa1\x9d\x84$\r:\x89'

第二种方法用sha1()方法创建一个实例,在创建时不需要传入要计算的数据,再使用update方法更新传入的数据,然后用hexdigest()或digest()返回其摘要值。

import hashlib
sha = hashlib.sha1()
sha.update(b'abcdefghijklmnopqrstuvwxyz')
print('sha:',sha.hexdigest())
print('sha:',sha.digest())

运行结果:

sha: 32d10c7b8cf96570ca04ce37f2a19d84240d3a89
sha: b'2\xd1\x0c{\x8c\xf9ep\xca\x04\xce7\xf2\xa1\x9d\x84$\r:\x89'

如果要计算的是文件的hash码,则将上面例子中的数据更换为从文件中获取的数据即可:

import hashlib
sha = hashlib.sha1()
with open('logo.png','rb') as pr:
    sha.update(pr.read())   # 从文件中读取数据
    print('sha:',sha.hexdigest())
    print('sha:',sha.digest())

运行结果:

sha: 35137c7716fd8790bec01b27a3ea65b0c795d520
sha: b"5\x13|w\x16\xfd\x87\x90\xbe\xc0\x1b'\xa3\xeae\xb0\xc7\x95\xd5 "

sha256、sha512、sha384、md5等其他几种文件摘要的例子:

#juzicode.com / VX:桔子code
import hashlib
with open('logo.png','rb') as pr:
    data = pr.read()
    sha = hashlib.sha1()
    sha.update(data)
    print('sha1:',sha.hexdigest())
    print('sha1:',sha.digest())

    sha = hashlib.sha256()
    sha.update(data)
    print('sha256:',sha.hexdigest())
    print('sha256:',sha.digest())
    
    sha = hashlib.sha384()
    sha.update(data)
    print('sha384:',sha.hexdigest())
    print('sha384:',sha.digest())
    
    sha = hashlib.sha512()
    sha.update(data)
    print('sha512:',sha.hexdigest())
    print('sha512:',sha.digest())
    
    sha = hashlib.md5()
    sha.update(data)
    print('md5:',sha.hexdigest())
    print('md5:',sha.digest())

运行结果:

sha1: 35137c7716fd8790bec01b27a3ea65b0c795d520
sha1: b"5\x13|w\x16\xfd\x87\x90\xbe\xc0\x1b'\xa3\xeae\xb0\xc7\x95\xd5 "
sha256: 5eaf9ffa04324260feba2be8ed4e538df07da07c4bf20faee656208829293c82
sha256: b'^\xaf\x9f\xfa\x042B`\xfe\xba+\xe8\xedNS\x8d\xf0}\xa0|K\xf2\x0f\xae\xe6V \x88))<\x82'
sha384: f52fbc4363bbf82255e3126d9e69a51692d8491a8bf3dfb85b4fb8357417499887e669d78f0888aafc9a2a7ad06ae763
sha384: b'\xf5/\xbcCc\xbb\xf8"U\xe3\x12m\x9ei\xa5\x16\x92\xd8I\x1a\x8b\xf3\xdf\xb8[O\xb85t\x17I\x98\x87\xe6i\xd7\x8f\x08\x88\xaa\xfc\x9a*z\xd0j\xe7c'
sha512: 3b204476201e02dff59602d346ab774bf5369e06a415fdbbb6dd6dd670547ade0c4aba3f1295713c42d3f847388b5fdc6aabe572b9991f01821a0cdc28ad2e1e
sha512: b'; Dv \x1e\x02\xdf\xf5\x96\x02\xd3F\xabwK\xf56\x9e\x06\xa4\x15\xfd\xbb\xb6\xddm\xd6pTz\xde\x0cJ\xba?\x12\x95q<B\xd3\xf8G8\x8b_\xdcj\xab\xe5r\xb9\x99\x1f\x01\x82\x1a\x0c\xdc(\xad.\x1e'
md5: ec14c325d9e70ceada9b6e67d894ccd7
md5: b'\xec\x14\xc3%\xd9\xe7\x0c\xea\xda\x9bng\xd8\x94\xcc\xd7'

3、crc32计算

crc32的计算需要使用到zlib模块的crc32()函数:

#juzicode.com / VX:桔子code
import zlib
with open('logo.png','rb') as pr:
    data = pr.read()
    value = zlib.crc32(data)
    print('crc32:',value)

运行结果:

<class 'int'>
crc32: 3657216124

扩展阅读:

  1. Python桔子教程

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注