You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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}")

脚本说明

  1. 解析模块:parse_pointer_blocks通过正则匹配//POINTER #X行,将每个指针条目按编号分组,存储所有行内容,确保每个条目独立成块。
  2. 合并模块:merge_blocks遍历日文块,匹配对应编号的英文块,只提取英文块中的文本内容(跳过重复的指针注释和#W32命令),追加到日文块末尾,同时清理多余空行保证格式整洁。
  3. 写入模块:write_merged_file按编号排序输出合并后的块,块之间保留空行分隔,还原原文件的排版格式。

内容的提问来源于stack exchange,提问作者Murow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:36:12