本文目录导读:

文件重复删除(Python)
import os
import hashlib
from collections import defaultdict
def find_duplicate_files(directory):
"""查找并删除重复文件"""
file_hash_map = defaultdict(list)
# 遍历文件并计算哈希值
for root, dirs, files in os.walk(directory):
for filename in files:
filepath = os.path.join(root, filename)
# 计算文件哈希
with open(filepath, 'rb') as f:
file_hash = hashlib.md5(f.read()).hexdigest()
file_hash_map[file_hash].append(filepath)
# 找到并删除重复文件
duplicates = []
for hash_value, file_list in file_hash_map.items():
if len(file_list) > 1:
# 保留第一个文件,删除其余重复
for filepath in file_list[1:]:
duplicates.append(filepath)
os.remove(filepath)
print(f"已删除重复文件: {filepath}")
return duplicates
# 使用示例
duplicates = find_duplicate_files("/path/to/your/directory")
print(f"共删除 {len(duplicates)} 个重复文件")
文本行去重(命令行)
#!/bin/bash
# 文本行去重脚本
input_file="$1"
output_file="$2"
if [ -z "$input_file" ] || [ -z "$output_file" ]; then
echo "用法: $0 输入文件 输出文件"
exit 1
fi
# 方法1: 使用 sort 和 uniq
sort "$input_file" | uniq > "$output_file"
# 方法2: 保留原始顺序
awk '!seen[$0]++' "$input_file" > "$output_file"
echo "去重完成!"
数据库重复记录删除(SQL)
-- 删除完全重复的行
DELETE FROM table_name
WHERE id NOT IN (
SELECT MIN(id)
FROM table_name
GROUP BY column1, column2, column3
);
-- 或使用临时表
CREATE TABLE temp_table AS
SELECT DISTINCT * FROM original_table;
DROP TABLE original_table;
ALTER TABLE temp_table RENAME TO original_table;
Excel/CSV 数据去重(Python)
import pandas as pd
def remove_duplicate_rows(csv_file, output_file, subset_columns=None):
"""
删除CSV文件中的重复行
Args:
csv_file: 输入文件路径
output_file: 输出文件路径
subset_columns: 用于判断重复的列名列表,None表示所有列
"""
# 读取CSV文件
df = pd.read_csv(csv_file)
# 检查重复行
duplicates = df.duplicated(subset=subset_columns)
# 打印重复信息
if duplicates.any():
duplicate_count = duplicates.sum()
print(f"发现 {duplicate_count} 个重复行")
# 保留第一个出现的,删除其余重复
df_cleaned = df.drop_duplicates(subset=subset_columns, keep='first')
# 保存结果
df_cleaned.to_csv(output_file, index=False)
print(f"已保存去重后的文件: {output_file}")
else:
print("未发现重复数据")
# 使用示例
remove_duplicate_rows("input.csv", "output.csv")
remove_duplicate_rows("input.csv", "output.csv", subset_columns=['name', 'email'])
图片重复检测(Python)
from PIL import Image
import imagehash
import os
from collections import defaultdict
def find_similar_images(directory, threshold=5):
"""查找相似图片(基于感知哈希)"""
hash_map = defaultdict(list)
for root, dirs, files in os.walk(directory):
for filename in files:
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
filepath = os.path.join(root, filename)
try:
# 计算感知哈希
with Image.open(filepath) as img:
phash = imagehash.phash(img)
hash_map[phash].append(filepath)
except Exception as e:
print(f"无法处理文件 {filepath}: {e}")
# 查找重复图片
duplicates = []
for hash_value, file_list in hash_map.items():
if len(file_list) > 1:
duplicates.extend(file_list[1:])
print(f"重复图片组: {file_list}")
return duplicates
# 使用示例
duplicate_images = find_similar_images("/path/to/images")
通用去重函数(Python)
def deduplicate_list(items, key_func=None):
"""
列表去重,保持原始顺序
Args:
items: 输入列表
key_func: 自定义比较键函数(可选)
Returns:
去重后的列表
"""
seen = set()
result = []
for item in items:
# 使用自定义键或直接比较
key = key_func(item) if key_func else item
if key not in seen:
seen.add(key)
result.append(item)
return result
# 使用示例
# 基本去重
numbers = [1, 2, 2, 3, 3, 4, 5, 5]
unique_numbers = deduplicate_list(numbers)
print(unique_numbers) # [1, 2, 3, 4, 5]
# 自定义键去重(基于字典的某个字段)
data = [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"},
{"id": 1, "name": "Alice"},
{"id": 3, "name": "Charlie"}
]
unique_data = deduplicate_list(data, key_func=lambda x: x['id'])
print(unique_data)
使用建议
- 备份数据:运行去重脚本前,务必备份原始数据
- 测试先行:先用小数据集测试脚本效果
- 选择合适方法:
- 文件去重:使用MD5或SHA256哈希
- 文本去重:使用awk或sort+uniq
- 结构化数据:使用数据库或pandas
- 性能考虑:大文件或大数据集时注意内存使用
- 确认逻辑:确认去重标准(完全匹配、部分匹配、模糊匹配)
选择哪种方法取决于你的具体需求和数据量大小,如有特定场景,可以提供更多细节以获得更针对性的解决方案。