Python基础入门 Day85 文件去重与内容比对

95次阅读
没有评论

共计 2212 个字符,预计需要花费 6 分钟才能阅读完成。

在处理大量文件时,文件去重是一个常见的需求。我们可能会遇到文件内容相同,但文件名不同的情况,或者同名文件在不同目录中有多个副本。Python 提供了多种方法来判断文件是否相同,常用的方式是基于文件内容的哈希值进行比较。

  1. 使用哈希值进行文件内容比对
    通过计算文件的哈希值(如 MD5、SHA1、SHA256),可以判断两个文件是否内容相同。常用的 hashlib 模块提供了多种哈希算法。
import hashlib

def get_file_hash(file_path, hash_algorithm='md5'):
    hash_func = hashlib.new(hash_algorithm)
    with open(file_path, 'rb') as f:
        while chunk := f.read(8192):  # 逐块读取文件
            hash_func.update(chunk)
    return hash_func.hexdigest()

# 示例:计算文件的 MD5 哈希值
file_hash = get_file_hash("example.txt", "md5")
print(f" 文件 MD5 哈希值: {file_hash}")

此方法适用于比较文件内容是否相同,无论文件名如何,只要内容一致,哈希值就会相同。

  1. 比较文件是否相同
    我们可以通过比较两个文件的哈希值来判断它们的内容是否相同。
def compare_files(file1, file2, hash_algorithm='md5'):
    return get_file_hash(file1, hash_algorithm) == get_file_hash(file2, hash_algorithm)

# 示例:比较两个文件是否相同
result = compare_files("file1.txt", "file2.txt")
if result:
    print(" 文件内容相同 ")
else:
    print(" 文件内容不同 ")

通过这种方法,即使文件名不同,也可以准确判断文件内容是否相同。

  1. 遍历目录进行文件去重
    如果需要去重某个文件夹中的文件,可以遍历文件夹,计算每个文件的哈希值,将相同内容的文件标记为重复并删除。
import os

def remove_duplicate_files(folder_path, hash_algorithm='md5'):
    seen_hashes = set()  # 存储已处理过的文件哈希值
    for root, dirs, files in os.walk(folder_path):
        for filename in files:
            file_path = os.path.join(root, filename)
            file_hash = get_file_hash(file_path, hash_algorithm)
            
            if file_hash in seen_hashes:
                print(f" 删除重复文件: {file_path}")
                os.remove(file_path)  # 删除文件
            else:
                seen_hashes.add(file_hash)

# 示例:去重文件夹中的重复文件
remove_duplicate_files("/path/to/directory")

此脚本会遍历指定目录及其子目录,查找并删除内容相同的文件。

  1. 基于文件大小的初步去重
    在某些场景下,我们可能希望先通过文件大小进行初步筛选,只有当文件大小相同的文件才会进行哈希比对。
import os

def get_file_size(file_path):
    return os.path.getsize(file_path)

def remove_duplicate_files_by_size(folder_path, hash_algorithm='md5'):
    seen_sizes = {}  # 存储文件大小和对应的文件路径
    for root, dirs, files in os.walk(folder_path):
        for filename in files:
            file_path = os.path.join(root, filename)
            file_size = get_file_size(file_path)
            
            if file_size in seen_sizes:
                # 如果文件大小相同,再进行哈希比对
                if compare_files(file_path, seen_sizes[file_size], hash_algorithm):
                    print(f" 删除重复文件: {file_path}")
                    os.remove(file_path)
                else:
                    seen_sizes[file_size] = file_path  # 文件大小相同,但内容不同
            else:
                seen_sizes[file_size] = file_path

# 示例:先按文件大小去重,再按内容去重
remove_duplicate_files_by_size("/path/to/directory")

这种方法可以提高去重效率,避免对每个文件都进行哈希计算。

总结:
文件去重是处理重复数据的重要手段,使用哈希值比对文件内容能够高效准确地判断文件是否重复。通过遍历目录、计算文件哈希并删除重复文件,可以轻松实现文件夹中的去重操作。

练习与思考:

  1. 编写一个程序,查找某个目录中所有相同内容的文件,并打印它们的路径。
  2. 修改去重程序,只保留第一个出现的文件,删除后续重复的文件。
  3. 使用 hashlib 计算多个文件的 SHA256 哈希值并进行比对,查找是否有重复文件。
正文完
 0
评论(没有评论)