如何遍历文本文件生成的列表,基于连续星号行创建子列表?
嘿,这个问题我熟!先给你说清楚为啥会报索引越界,再给你个靠谱的解决方案。
为啥会出现索引越界?
你写的range(len(TextFile_List))会让i从0遍历到列表最后一个元素的索引(也就是len(TextFile_List)-1),这时候i+1就等于列表的总长度——但列表的最大索引是「长度减一」,自然就触发了越界错误。哪怕你把循环范围改成range(len(TextFile_List)-1),这种靠索引判断连续行的方式也不够灵活,不如换个思路处理区块分割。
靠谱的区块分割方案
我们可以用一个临时列表来「收集」当前区块的内容,遇到分隔符*的时候就把收集好的区块存起来,完全不用管索引的问题,逻辑也更清晰:
all_blocks = [] current_block = [] # 用with语句读文件更安全,避免忘记关闭文件 with open('TextFile.txt', 'r') as f: for line in f: stripped_line = line.strip() # 先跳过空行,避免原文件换行带来的干扰 if not stripped_line: continue if stripped_line == '*': # 遇到分隔符,检查当前有没有收集到内容 if current_block: # 只保留Section开头的区块(自动过滤原文件里的Header行) if current_block[0].startswith('Section'): # 把Section标题后面的冒号去掉,和你要的格式一致 current_block[0] = current_block[0].rstrip(':') # 注意要复制列表,不然后续清空current_block会影响已存的内容 all_blocks.append(current_block.copy()) # 清空临时列表,准备收集下一个区块 current_block.clear() else: # 不是分隔符,就把行内容加入当前区块 current_block.append(stripped_line) # 处理最后一个区块(避免原文件没有结尾的*分隔符) if current_block and current_block[0].startswith('Section'): current_block[0] = current_block[0].rstrip(':') all_blocks.append(current_block.copy()) # 现在你可以直接取对应的区块了 List1 = all_blocks[0] List2 = all_blocks[1] print(List1) # 输出: ["Section 1 Header", "Content", "Content", "Content"] print(List2) # 输出: ["Section 2 Header", "Content", "Content", "Content"]
这段代码的优势
- 完全避免了索引操作,从根源上解决越界问题
- 自动跳过空行,处理原文件换行带来的无效内容
- 精准过滤出你需要的Section区块,自动忽略原文件里的Header行和分隔符
- 兼容没有结尾分隔符的情况,容错性更强
内容的提问来源于stack exchange,提问作者flamingbird123
相关产品推荐
相关产品推荐

