Python自动删除小说重复行:保留顺序+大文件兼容教程

谈天说地4天前发布 esoua
1 00
网盘资源搜索

有没有试过看小说翻到一半,突然蹦出两段一模一样的对话?气得想摔手机!手动删吧,10万行文本删到天亮;用工具吧,要么打乱段落顺序读得头晕,要么大文件直接卡死… 小编当年被《诡秘之主》的重复段落逼疯后,终于搞定了两全法:​​Python一键去重保顺序,1GB文件也能跑​​!


​一、为啥普通方法会毁掉小说阅读?​

  1. ​集合(set)去重:顺序全乱套​

    直接set(lines)删重复倒是快,但段落顺序全打乱——前一秒主角在打架,下一秒突然跳到三个月前吃火锅,看得人精神分裂。

  2. ​大文件直接卡死​

    几十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 = []  # 清空当前块

​原理​​:把大文件切成小块分批处理,内存永不爆炸,还能保顺序。


​三、避坑指南:小说党必看​

  1. ​空行也是关键分隔符!​

    别用line.strip()清理空格——会把缩进和空行删光,导致段落挤成一大坨!用if line.isspace()单独判断空行更靠谱。

  2. ​小心“伪重复”剧情伏笔​

    《盗墓笔记》里“青铜门后的终极”重复出现6次,其实是重要线索!建议先用collections.Counter统计高频重复句,人工确认再删。

  3. ​编码错误毁灭性打击​

    遇到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️⃣ 全局搜索高频词(如“忽然”“岂料”),确认是否伏笔。

代码再强也是辅助,​​最后那眼人工审核​​,才是对好小说的尊重啊…(具体咋实现?害,我也不是全懂算法,但结果对得上原文就行!)

© 版权声明

相关文章

暂无评论

none
暂无评论...