如何编写重复数据删除脚本

wen 实用脚本 26

本文目录导读:

如何编写重复数据删除脚本

  1. 文件重复删除(Python)
  2. 文本行去重(命令行)
  3. 数据库重复记录删除(SQL)
  4. Excel/CSV 数据去重(Python)
  5. 图片重复检测(Python)
  6. 通用去重函数(Python)
  7. 使用建议

文件重复删除(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)

使用建议

  1. 备份数据:运行去重脚本前,务必备份原始数据
  2. 测试先行:先用小数据集测试脚本效果
  3. 选择合适方法
    • 文件去重:使用MD5或SHA256哈希
    • 文本去重:使用awk或sort+uniq
    • 结构化数据:使用数据库或pandas
  4. 性能考虑:大文件或大数据集时注意内存使用
  5. 确认逻辑:确认去重标准(完全匹配、部分匹配、模糊匹配)

选择哪种方法取决于你的具体需求和数据量大小,如有特定场景,可以提供更多细节以获得更针对性的解决方案。

抱歉,评论功能暂时关闭!