Python实现快速大文件比较代码解析

  • Post category:Python

Python实现快速大文件比较代码解析

在处理大文件比较时,常常会遇到内存占用过高、速度过慢等问题。本文将介绍一种基于hash的快速大文件比较方法,以及其在Python中代码的实现。

思路

在比较大文件时,我们无法将整个文件一次性读入内存进行比较,因此需要分块读取文件,对每个块分别计算hash值,并将hash值存储于字典中。

比较两个文件时,则需要对它们的所有块分别计算hash值,并从字典中查找对应的hash值。若两个文件的hash值一致,则说明两个块内容相同。否则,这两个块内容不同。

代码解析

以下为基于hash的大文件比较Python代码的实现:

import hashlib
import os

CHUNK_SIZE = 1024 * 1024
BLOCKSIZE = 65536

def get_file_hash(filepath):
    '''
    计算文件的hash值
    '''
    hasher = hashlib.md5()
    with open(filepath, 'rb') as file:
        while True:
            buf = file.read(BLOCKSIZE)
            if not buf:
                break
            hasher.update(buf)
    return hasher.hexdigest()

def chunk_reader(fobj, chunk_size=CHUNK_SIZE):
    '''
    分块读取文件,每块大小为chunk_size
    '''
    while True:
        chunk = fobj.read(chunk_size)
        if not chunk:
            return
        yield chunk

def get_large_file_hash(filename):
    '''
    计算大文件的hash值
    '''
    hasher = hashlib.md5()
    with open(filename, 'rb') as file:
        for chunk in chunk_reader(file):
            hasher.update(hashlib.md5(chunk).hexdigest().encode('utf-8'))
    return hasher.hexdigest()

def compare_files(file1, file2):
    '''
    比较两个文件的hash值
    '''
    hash_dict = {}
    with open(file1, 'rb') as file:
        for chunk in chunk_reader(file):
            hash_dict[hashlib.md5(chunk).hexdigest()] = True

    with open(file2, 'rb') as file:
        for chunk in chunk_reader(file):
            if not hash_dict.get(hashlib.md5(chunk).hexdigest()):
                return False
    return True

示例

示例一

比较两个文件:

compare_files('file1.bin', 'file2.bin')

该函数将分别对两个文件的所有块计算hash值,并比较这两个文件的hash值是否一致。若一致,说明两个文件内容相同。否则,这两个文件内容不同。

示例二

计算一个大文件的hash值:

get_large_file_hash('bigfile.bin')

将计算bigfile.bin文件的hash值,并返回其MD5值。如果该文件过大,使用传统的完整加载文件操作可能会导致内存不足。而通过分块读取文件的方式,我们则可以快速计算出该文件的hash值。