实用脚本能批量去重吗?

wen 实用脚本 10

本文目录导读:

实用脚本能批量去重吗?

  1. 文本文件(如TXT、日志)按行去重
  2. CSV/表格数据(基于某列去重)
  3. 图片/文件去重(按MD5哈希)
  4. Excel (.xlsx) 多个工作表去重
  5. 终极通用方案: dupefind 或自定义 CLI 脚本
  6. 注意事项

文本文件(如TXT、日志)按行去重

适用场景:一个文件或批量文件中内容重复的行。

Shell 脚本(Linux/macOS)

#!/bin/bash
# 批量处理当前目录下所有 .txt 文件,按行去重后输出到新文件
for file in *.txt; do
    sort "$file" | uniq > "${file%.txt}_unique.txt"
done

Python 脚本(跨平台,处理大文件)

import os
# 处理指定目录下所有 .txt 文件
for filename in os.listdir('.'):
    if filename.endswith('.txt'):
        with open(filename, 'r') as f:
            lines = f.readlines()
        # 利用 set 去重,但会失去顺序;如需保留顺序,用 dict.fromkeys
        unique_lines = list(dict.fromkeys(lines))
        with open(f'unique_{filename}', 'w') as f:
            f.writelines(unique_lines)

CSV/表格数据(基于某列去重)

适用场景:Excel导出的CSV文件,按“ID”或“邮箱”列去重。

Python Pandas(保留第一行或最后一行)

import pandas as pd
import glob
# 批量处理所有CSV文件
for file in glob.glob("*.csv"):
    df = pd.read_csv(file)
    # 按“email”列去重,保留第一个(keep='last' 保留最后一个)
    df_unique = df.drop_duplicates(subset='email', keep='first')
    df_unique.to_csv(f'unique_{file}', index=False)

AWK 命令行(处理超大CSV,不加载内存)

# 按第一列去重,输出第一次出现的行
awk -F',' '!seen[$1]++' input.csv > output.csv
  • $1 改为你要去重的列号(如 $2 表示第二列)

图片/文件去重(按MD5哈希)

适用场景:找出并删除完全相同的重复文件(图片、文档等)。

Python 脚本(遍历目录,找出重复文件)

import os
import hashlib
def get_md5(file_path):
    h = hashlib.md5()
    with open(file_path, 'rb') as f:
        for chunk in iter(lambda: f.read(8192), b''):
            h.update(chunk)
    return h.hexdigest()
hashes = {}
for root, dirs, files in os.walk("目标目录"):
    for name in files:
        path = os.path.join(root, name)
        md5 = get_md5(path)
        if md5 in hashes:
            print(f"重复: {path} <-> {hashes[md5]}")
            # 可选:os.remove(path)
        else:
            hashes[md5] = path

命令行工具(无需编程)

  • Linux: fdupes -r . (列出重复文件,-d 删除)
  • macOS: brew install fdupes 后同上
  • Windows: 可用 dupeGuru(图形化)或 PowerShell 脚本

Excel (.xlsx) 多个工作表去重

适用场景:一个Excel文件内有多个Sheet,每个Sheet按行去重。

Python openpyxl

from openpyxl import load_workbook
wb = load_workbook('data.xlsx')
for sheet_name in wb.sheetnames:
    ws = wb[sheet_name]
    seen = set()
    rows_to_delete = []
    for row in ws.iter_rows(values_only=True):
        # 假设去重依据是整行(可改为某列,如 row[0])
        if row in seen:
            rows_to_delete.append(row)
        else:
            seen.add(row)
    # 逆向删除(从后往前删除行)
    for row in rows_to_delete[::-1]:
        for cell in row:
            ws.delete_rows(cell.row)
wb.save('unique_data.xlsx')

终极通用方案: dupefind 或自定义 CLI 脚本

如果需要频率使用,可以编写一个通用脚本,支持参数:

python dedup.py --input *.txt --method md5 --output deduped/

注意事项

  • 内存限制:大文件(>2GB)用 sort | uniq 或数据库工具。
  • :去重时明确“保留首次出现”还是“最后一次出现”。
  • 确认删除:图片/文件去重时,建议先列清单,确认后再删除。

需要针对特定格式(如JSON、PDF内的文本)或更复杂的逻辑(如模糊匹配),可以补充说明,我可以给出更精准的脚本。

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