如何用Python有条件合并带POINTER标记的两个文本文件?
如何用Python实现带POINTER标记的文本文件条件合并?
需求说明
现有两个带POINTER标记的文本文件,需按POINTER编号(如#3、#4)匹配合并:
- 第一个文件为日文注释版,每个POINTER条目包含指针注释、
#W32命令和带//前缀的日文文本 - 第二个文件为英文翻译版,每个POINTER条目包含指针注释、
#W32命令和英文文本 - 合并规则:将第二个文件中对应编号的英文文本,追加到第一个文件对应编号条目的日文文本之后,保留原有的空行分隔格式
实现脚本
import re def parse_pointer_blocks(file_path): """解析文件,按POINTER编号分组存储内容""" pointer_pattern = re.compile(r'//POINTER #(\d+) @') blocks = {} current_num = None current_content = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: stripped_line = line.rstrip('\n') # 匹配POINTER行,提取编号 match = pointer_pattern.match(stripped_line) if match: # 保存当前块(如果存在) if current_num is not None: blocks[current_num] = current_content # 初始化新的POINTER块 current_num = match.group(1) current_content = [stripped_line] elif current_num is not None: # 收集当前块的内容,跳过开头无意义的空行 if stripped_line or current_content: current_content.append(stripped_line) # 保存最后一个POINTER块 if current_num is not None: blocks[current_num] = current_content return blocks def merge_blocks(jp_blocks, en_blocks): """合并日文块与英文块,将英文文本追加到对应日文条目后""" merged = {} for num in jp_blocks: jp_content = jp_blocks[num] # 提取英文块的文本部分(跳过前两行的指针注释和#W32命令) en_text_lines = en_blocks.get(num, [])[2:] if num in en_blocks else [] merged_content = jp_content.copy() if en_text_lines: # 移除日文块末尾的空行,避免出现多余空行 while merged_content and merged_content[-1] == '': merged_content.pop() # 追加英文文本 merged_content.extend(en_text_lines) merged[num] = merged_content return merged def write_merged_file(merged_blocks, output_path): """将合并后的内容写入输出文件""" with open(output_path, 'w', encoding='utf-8') as f: first_block = True # 按POINTER编号从小到大排序输出 for num in sorted(merged_blocks.keys(), key=int): if not first_block: # 块之间添加空行分隔 f.write('\n\n') first_block = False # 写入当前块的每一行 for line in merged_blocks[num]: f.write(line + '\n') # 主执行流程 if __name__ == '__main__': # 替换为你的实际文件路径 jp_file_path = '日文原文件.txt' en_file_path = '英文翻译文件.txt' output_file_path = '合并结果.txt' # 解析两个文件的POINTER块 jp_blocks = parse_pointer_blocks(jp_file_path) en_blocks = parse_pointer_blocks(en_file_path) # 合并块 merged_result = merge_blocks(jp_blocks, en_blocks) # 写入结果文件 write_merged_file(merged_result, output_file_path) print(f"合并完成,结果已保存至 {output_file_path}")
脚本说明
- 解析模块:
parse_pointer_blocks通过正则匹配//POINTER #X行,将每个指针条目按编号分组,存储所有行内容,确保每个条目独立成块。 - 合并模块:
merge_blocks遍历日文块,匹配对应编号的英文块,只提取英文块中的文本内容(跳过重复的指针注释和#W32命令),追加到日文块末尾,同时清理多余空行保证格式整洁。 - 写入模块:
write_merged_file按编号排序输出合并后的块,块之间保留空行分隔,还原原文件的排版格式。
内容的提问来源于stack exchange,提问作者Murow
相关产品推荐
相关产品推荐

