如何合并地缘政治描述文本并去重,同时保留内部顺序?
问题分析
你当前的代码存在三个核心问题:
- 用
set()去重会彻底打乱文本原有顺序,因为集合是无序结构 readlines()会保留每行末尾的换行符,后续"\n".join()会导致重复换行,出现多余空行/空格- 原代码按单一行去重,但你需要的是按完整的地点描述块去重,不是单条行记录
改进方案
以下是适配需求的优化代码,实现按地点块去重、保留原始顺序,并清理多余空格:
import os import glob def read_location_blocks(file_path): """读取文件,按地点块分割并清理冗余格式""" blocks = [] current_block = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: stripped_line = line.strip() # 以空行作为地点块的分隔符(可根据实际格式调整判断逻辑) if not stripped_line: if current_block: block_str = "\n".join(current_block).strip() blocks.append(block_str) current_block = [] else: current_block.append(stripped_line) # 处理文件末尾未闭合的最后一个块 if current_block: block_str = "\n".join(current_block).strip() blocks.append(block_str) return blocks # 收集并去重所有地点块 all_blocks = [] seen_blocks = set() for file in glob.glob('*.txt'): blocks = read_location_blocks(file) for block in blocks: if block not in seen_blocks: seen_blocks.add(block) all_blocks.append(block) # 写入合并后的文件,块之间用空行分隔 with open('combinedfile.txt', 'w', encoding='utf-8') as fo: fo.write("\n\n".join(all_blocks))
代码说明
read_location_blocks函数:负责将单个文件按地点块拆分,同时清理每行多余空格,把每个块整理成独立字符串- 去重逻辑:用
seen_blocks集合记录已出现的块,all_blocks列表按顺序保存首次出现的块,既实现去重又保留原始顺序 - 写入规则:用
"\n\n".join()让不同地点块之间用空行分隔,符合阅读习惯
适配提示
如果你的地点块不是以空行分隔,而是以特定规则开头(比如行首是地点名称),可修改read_location_blocks里的分割判断逻辑,比如添加对地点名称格式的校验来识别块的起始。
内容的提问来源于stack exchange,提问作者batardavelo
相关产品推荐
相关产品推荐

