共计 2212 个字符,预计需要花费 6 分钟才能阅读完成。
在处理大量文件时,文件去重是一个常见的需求。我们可能会遇到文件内容相同,但文件名不同的情况,或者同名文件在不同目录中有多个副本。Python 提供了多种方法来判断文件是否相同,常用的方式是基于文件内容的哈希值进行比较。
- 使用哈希值进行文件内容比对
通过计算文件的哈希值(如 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}")
此方法适用于比较文件内容是否相同,无论文件名如何,只要内容一致,哈希值就会相同。
- 比较文件是否相同
我们可以通过比较两个文件的哈希值来判断它们的内容是否相同。
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(" 文件内容不同 ")
通过这种方法,即使文件名不同,也可以准确判断文件内容是否相同。
- 遍历目录进行文件去重
如果需要去重某个文件夹中的文件,可以遍历文件夹,计算每个文件的哈希值,将相同内容的文件标记为重复并删除。
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")
此脚本会遍历指定目录及其子目录,查找并删除内容相同的文件。
- 基于文件大小的初步去重
在某些场景下,我们可能希望先通过文件大小进行初步筛选,只有当文件大小相同的文件才会进行哈希比对。
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")
这种方法可以提高去重效率,避免对每个文件都进行哈希计算。
总结:
文件去重是处理重复数据的重要手段,使用哈希值比对文件内容能够高效准确地判断文件是否重复。通过遍历目录、计算文件哈希并删除重复文件,可以轻松实现文件夹中的去重操作。
练习与思考:
- 编写一个程序,查找某个目录中所有相同内容的文件,并打印它们的路径。
- 修改去重程序,只保留第一个出现的文件,删除后续重复的文件。
- 使用
hashlib计算多个文件的 SHA256 哈希值并进行比对,查找是否有重复文件。
正文完