Python改写文件拆分函数时遭遇IndexError: list index out of range问题
解决Python文件拆分函数的IndexError问题
问题背景
需要实现一个函数,从输入文件中提取标记为P(通过)和F(失败)的条目,分别写入PassFile.txt和FailFile.txt。原代码可正常运行,但改写为函数后出现IndexError: list index out of range错误。
原可运行代码
fileName = 'inputFile.txt' f = open(fileName,'r') output1 = "PassFile.txt" output2 = "FailFile.txt" passFile = open(output1,'w') failFile = open(output2, 'w') for line in f: line_split = line.split() if line_split[2] == "P": passFile.write(line) else: failFile.write(line) passFile.close() failFile.close()
用户编写的错误函数
def fileIO(inputFile='inputFile.txt'): with open(inputFile, 'r') as f: f = f.read() for line in f: line_splint = line.split(" ") if line_splint[2] == 'P': with open('PassFile.txt', 'w') as PassFile: PassFile.write(line) elif line_splint[2] == 'F': with open('FailFile.txt', 'w') as FailFile: FailFile.write(line) else: pass fileIO()
输入文件内容
Mary 25 P John 32 P Dylan 19 F Julia 23 F Chad 17 F Jack 20 F
错误信息
Traceback (most recent call last): File "fileIO.py", line 33, in <module> fileIO() File "fileIO.py", line 24, in fileIO if line_splint[2] == 'P': IndexError: list index out of range
错误原因分析
- 遍历单位错误:
f = f.read()将整个文件读取为单个字符串,后续for line in f会遍历字符串的每个字符,而非文件的每一行。单个字符split(" ")后生成的列表长度不足3,导致索引越界。 - 文件写入模式错误:每次写入都用
open('xxx', 'w'),该模式会清空文件原有内容,最终只会保留最后一条符合条件的记录。 - 拼写与拆分方式问题:
line_splint是拼写错误(应为line_split);split(" ")仅按单个空格拆分,无法处理多行空格或制表符,而原代码的split()会自动处理任意空白符。 - 未处理空行:若输入文件存在空行,拆分后列表长度不足3,也会触发索引错误。
修正后的函数
def fileIO(inputFile='inputFile.txt'): # 打开两个输出文件,使用with语句自动管理关闭 with open('PassFile.txt', 'w') as pass_file, open('FailFile.txt', 'w') as fail_file: with open(inputFile, 'r') as input_file: for line in input_file: # 去除首尾空白字符,跳过空行 stripped_line = line.strip() if not stripped_line: continue # 按任意空白符拆分 line_split = stripped_line.split() # 确保列表长度足够,避免索引错误 if len(line_split) >= 3: status = line_split[2] if status == 'P': pass_file.write(line) elif status == 'F': fail_file.write(line) fileIO()
关键优化点
- 直接遍历文件对象
input_file,每次循环对应文件的一行,无需read()。 - 一次性打开两个输出文件,使用
w模式初始化(清空原有内容),后续直接追加写入,避免重复打开关闭。 - 处理每行前先去除首尾空白并跳过空行,避免空行导致的索引问题。
- 拆分前检查列表长度,确保索引访问安全。
- 使用
split()替代split(" "),兼容多种空白分隔符。
内容的提问来源于stack exchange,提问作者codehunter-py
相关产品推荐
相关产品推荐

