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
相关产品推荐
相关产品推荐

