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
错误原因分析
line.next()用法错误:for line in text循环中,line是字符串对象,没有next()方法,要获取下一行需调用文件迭代器的next()- 条件判断逻辑错误:原代码
if "API" and "77-003" in line等价于if "77-003" in line,正确逻辑应为"API" in line and "77-003" in line - 行号处理混乱:处理下一行时未正确同步行号计数,导致记录的行号错误
- 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()
代码修改说明
- 使用文件迭代器:将
text转为text_iter,通过next(text_iter)手动获取下一行,避免字符串调用next()的错误 - 修正条件判断:明确判断
"API" in line and "77-003" in line,确保逻辑正确 - 同步行号计数:获取下一行时同步增加
txt_line_num,保证记录的行号与实际TXT行号一致 - 正确引用Workbook对象:先创建
workbook变量,再添加工作表,最后调用workbook.close()保存文件 - 增加异常处理:用
try-except捕获StopIteration,避免文件末尾无下一行时崩溃 - 去除冗余导入:原代码中
os和listdir未使用,直接删除
内容的提问来源于stack exchange,提问作者cowboykevin05
相关产品推荐
相关产品推荐

