本文目录导读:

- 文本文件(如TXT、日志)按行去重
- CSV/表格数据(基于某列去重)
- 图片/文件去重(按MD5哈希)
- Excel (.xlsx) 多个工作表去重
- 终极通用方案:
dupefind或自定义 CLI 脚本 - 注意事项
文本文件(如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内的文本)或更复杂的逻辑(如模糊匹配),可以补充说明,我可以给出更精准的脚本。