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

Python遍历文本文件获取下一行报错的解决方法

解决Python遍历TXT并写入XLSX时获取下一行的错误问题

问题说明

需要遍历TXT文件,将符合条件的行写入XLSX文件:

  • 包含"API"和"77-003"的行,提取对应内容并记录行号
  • 仅含"API"且不含"67025"的行,需要提取下一行的内容并记录下一行的行号

当前代码处理第一种情况正常,但处理第二种情况时调用line.next()报错AttributeError: 'str' object has no attribute 'next',输出不符合预期。

示例文本文件

API 77-003-200
well dixie #1
API
67025650
well doodle #2
API 77-003-908
well dw washburn #1

期望输出

77-003-200   | 1
67025650     | 4
77-003-908   | 6

当前错误输出

77-003-200   | 1
API          | 3
77-003-908   | 6

错误原因分析

  1. line.next()用法错误:for line in text循环中,line是字符串对象,没有next()方法,要获取下一行需调用文件迭代器的next()
  2. 条件判断逻辑错误:原代码if "API" and "77-003" in line等价于if "77-003" in line,正确逻辑应为"API" in line and "77-003" in line
  3. 行号处理混乱:处理下一行时未正确同步行号计数,导致记录的行号错误
  4. Workbook对象未正确引用:原代码直接通过xl.Workbook(...).add_worksheet()创建worksheet,未保存Workbook对象,导致后续workbook.close()报错

修正后的代码

import xlsxwriter as xl

# 初始化工作簿和工作表
workbook = xl.Workbook('myfile.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write(0, 0, 'API')
worksheet.write(0, 1, 'Line Number')

# 行号计数器,对应TXT文件的实际行号
txt_line_num = 0
# XLSX的写入行号(从第2行开始,第1行是表头)
xlsx_row = 1

with open('C:/Project/file.txt', 'r', encoding="utf8") as text:
    # 将文件对象转为迭代器,方便手动获取下一行
    text_iter = iter(text)
    for line in text_iter:
        txt_line_num += 1
        line = line.strip()
        if not line:
            continue
        
        # 处理包含API和77-003的行
        if "API" in line and "77-003" in line:
            # 提取77-003开头的内容
            api_content = line.split("API")[-1].strip()
            worksheet.write(xlsx_row, 0, api_content)
            worksheet.write(xlsx_row, 1, txt_line_num)
            xlsx_row += 1
        
        # 处理仅含API且不含67025的行,取其下一行内容
        elif "API" in line and "67025" not in line:
            try:
                # 获取下一行
                next_line = next(text_iter).strip()
                txt_line_num += 1
                # 写入下一行内容和对应的行号
                worksheet.write(xlsx_row, 0, next_line)
                worksheet.write(xlsx_row, 1, txt_line_num)
                xlsx_row += 1
            except StopIteration:
                # 防止文件末尾无下一行的情况
                pass

# 关闭工作簿,保存文件
workbook.close()

代码修改说明

  1. 使用文件迭代器:将text转为text_iter,通过next(text_iter)手动获取下一行,避免字符串调用next()的错误
  2. 修正条件判断:明确判断"API" in line and "77-003" in line,确保逻辑正确
  3. 同步行号计数:获取下一行时同步增加txt_line_num,保证记录的行号与实际TXT行号一致
  4. 正确引用Workbook对象:先创建workbook变量,再添加工作表,最后调用workbook.close()保存文件
  5. 增加异常处理:用try-except捕获StopIteration,避免文件末尾无下一行时崩溃
  6. 去除冗余导入:原代码中os和listdir未使用,直接删除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:03:23