有没有试过看小说翻到一半,突然蹦出两段一模一样的对话?气得想摔手机!手动删吧,10万行文本删到天亮;用工具吧,要么打乱段落顺序读得头晕,要么大文件直接卡死… 小编当年被《诡秘之主》的重复段落逼疯后,终于搞定了两全法:Python一键去重保顺序,1GB文件也能跑!
一、为啥普通方法会毁掉小说阅读?
集合(set)去重:顺序全乱套
直接
set(lines)
删重复倒是快,但段落顺序全打乱——前一秒主角在打架,下一秒突然跳到三个月前吃火锅,看得人精神分裂。大文件直接卡死
几十MB的小说还能硬扛,遇到《三体》全集这种1GB+的,
readlines()
一次性读进内存?直接内存溢出报错崩给你看。
二、三招保顺序的Python神代码
▶ 基础版:字典去重(50MB内小说通用)
python下载复制运行from collections import OrderedDict def remove_duplicates(input_file, output_file): with open(input_file, 'r', encoding='utf-8') as f_in: # 用字典键唯一性去重,且保插入顺序 unique_lines = OrderedDict.fromkeys(f_in.readlines()) with open(output_file, 'w', encoding='utf-8') as f_out: f_out.writelines(unique_lines.keys()) # 调用示例 remove_duplicates('novel.txt', 'cleaned_novel.txt')
效果:删光重复行,但段落顺序和原文件100%一致。
▶ 进阶版:生成器+缓存(500MB文件适用)
python下载复制运行def stream_remove_duplicates(input_file, output_file): seen = set() with open(output_file, 'w', encoding='utf-8') as f_out: with open(input_file, 'r', encoding='utf-8') as f_in: for line in f_in: if line not in seen: # 检查是否重复 seen.add(line) f_out.write(line) # 非重复行立刻写入
优势:逐行流式处理,内存只存已出现文本,500MB文件内存占用不到50MB。
▶ 终极大招:分块处理(1GB+文件救星)
python下载复制运行CHUNK_SIZE = 100000 # 10万行为一块 def chunk_remove_duplicates(input_file, output_file): with open(output_file, 'w', encoding='utf-8') as f_out: seen = set() chunk = [] with open(input_file, 'r', encoding='utf-8') as f_in: for i, line in enumerate(f_in): chunk.append(line) if (i + 1) % CHUNK_SIZE == 0: # 满10万行处理一次 for text in chunk: if text not in seen: seen.add(text) f_out.write(text) chunk = [] # 清空当前块
原理:把大文件切成小块分批处理,内存永不爆炸,还能保顺序。
三、避坑指南:小说党必看
空行也是关键分隔符!
别用
line.strip()
清理空格——会把缩进和空行删光,导致段落挤成一大坨!用if line.isspace()
单独判断空行更靠谱。小心“伪重复”剧情伏笔
《盗墓笔记》里“青铜门后的终极”重复出现6次,其实是重要线索!建议先用
collections.Counter
统计高频重复句,人工确认再删。编码错误毁灭性打击
遇到GBK编码的旧小说,直接
encoding='utf-8'
会报错。加一行异常捕获更安全:python下载复制运行try: with open(file, 'r', encoding='utf-8') as f: ... except UnicodeDecodeError: with open(file, 'r', encoding='gbk') as f: ... # 兼容中文老文件
小编心得:工具是死的,小说是活的
虽然代码能删掉99%的机械重复,但有些“重复”恰恰是作者的匠心——比如《三体》里反复出现的“不要回答!”,删了剧情直接崩盘!
建议操作流:
1️⃣ 先用分块代码处理超大型文件;
2️⃣ 用VSCode对比工具检查
原文件vs去重后文件
;3️⃣ 全局搜索高频词(如“忽然”“岂料”),确认是否伏笔。
代码再强也是辅助,最后那眼人工审核,才是对好小说的尊重啊…(具体咋实现?害,我也不是全懂算法,但结果对得上原文就行!)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...