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

Python实现:从文本文件标记间提取随机数量的行

解决方案:从带seq标记的文本文件中提取随机行

听起来你需要处理一批大文本文件,从seq call到对应seq done的操作块里随机抽取指定数量的行?我来给你捋个Python实现思路,分步骤来:

1. 先明确文本结构规则

先确认下你的文件格式:每个操作块是从seq call @ ...开始,到下一个对应的seq done @ ...结束,中间是具体的操作内容(比如retrieve BIOS data using...这类行)。我们的目标就是定位这些块,然后从每个块里随机抽若干行,或者从所有块里随机抽指定数量的行——下面的代码默认是从每个seq call-seq done块中随机抽取随机数量的行,如果需求不同可以灵活调整。

2. 核心实现步骤

  • 遍历目标目录下的所有文本文件
  • 对每个文件,逐行读取,识别seq call和seq done的边界,收集块内的有效内容行
  • 对每个收集到的块,随机选择1到块内总行数之间的随机数量的行(也可以改成固定数量)
  • 将提取的内容整理保存到结果文件,或者直接输出

3. 完整代码示例

import os
import random
from pathlib import Path

def extract_random_lines_from_seq_blocks(input_dir, output_file, min_lines=1, max_lines=None):
    """
    从指定目录的所有文本文件中,提取seq call和seq done之间的随机数量行
    :param input_dir: 存放文本文件的目录
    :param output_file: 结果保存的文件路径
    :param min_lines: 每个块最少提取的行数,默认1
    :param max_lines: 每个块最多提取的行数,默认是块内总行数
    """
    # 遍历目录下所有文本文件(假设是.txt后缀,可根据实际调整)
    text_files = list(Path(input_dir).glob("*.txt"))
    if not text_files:
        print("未找到任何文本文件!")
        return
    
    with open(output_file, "w", encoding="utf-8") as out_f:
        for file_path in text_files:
            print(f"正在处理文件: {file_path.name}")
            in_block = False
            block_lines = []
            
            with open(file_path, "r", encoding="utf-8") as f:
                for line in f:
                    line_stripped = line.strip()
                    # 检测seq call,进入操作块
                    if line_stripped.startswith("seq call @"):
                        in_block = True
                        # 这里选择不保留seq call行,只收集后续内容;如果需要保留,把continue删掉即可
                        continue
                    # 检测seq done,结束当前块并处理
                    if line_stripped.startswith("seq done @"):
                        in_block = False
                        if block_lines:
                            # 确定要抽取的行数:随机在min和块行数(或max_lines)之间
                            num_to_extract = random.randint(
                                min_lines, 
                                min(len(block_lines), max_lines) if max_lines else len(block_lines)
                            )
                            # 随机抽取行
                            selected_lines = random.sample(block_lines, num_to_extract)
                            # 写入结果,加上文件来源标记方便溯源
                            out_f.write(f"--- 来自文件: {file_path.name} ---\n")
                            out_f.writelines(selected_lines)
                            out_f.write("\n")
                        # 清空块内容,准备下一个块
                        block_lines = []
                        continue
                    # 如果在块内,收集非空的内容行(可以根据需求去掉空行过滤)
                    if in_block and line_stripped:
                        block_lines.append(line)

# 使用示例
if __name__ == "__main__":
    # 替换成你的输入目录和输出文件路径
    INPUT_DIRECTORY = "./your_text_files"
    OUTPUT_FILE = "./extracted_random_lines.txt"
    extract_random_lines_from_seq_blocks(INPUT_DIRECTORY, OUTPUT_FILE)
    print(f"提取完成!结果已保存到: {OUTPUT_FILE}")

4. 代码调整点说明

  • 文件匹配:代码里用*.txt匹配文件,如果你的文件是其他后缀(比如.log),修改glob的参数即可
  • 块的容错:如果你的文件存在seq call没有对应seq done的情况,可以加日志记录这类异常块,避免数据丢失
  • 抽取规则:如果想固定抽取N行,把num_to_extract改成固定值;如果想从所有块的所有行里随机抽指定数量,可以把所有块的行收集到一个大列表后再抽样
  • 编码处理:代码默认用utf-8编码,如果你的文件是其他编码(比如gbk),修改open里的encoding参数即可

5. 测试建议

先拿一个小的测试文件跑一遍,确认提取的内容符合预期,再批量处理大文件,避免出现意外问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:56:07