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

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

错误原因分析

  1. 遍历单位错误:f = f.read()将整个文件读取为单个字符串,后续for line in f会遍历字符串的每个字符,而非文件的每一行。单个字符split(" ")后生成的列表长度不足3,导致索引越界。
  2. 文件写入模式错误:每次写入都用open('xxx', 'w'),该模式会清空文件原有内容,最终只会保留最后一条符合条件的记录。
  3. 拼写与拆分方式问题:line_splint是拼写错误(应为line_split);split(" ")仅按单个空格拆分,无法处理多行空格或制表符,而原代码的split()会自动处理任意空白符。
  4. 未处理空行:若输入文件存在空行,拆分后列表长度不足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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:06:35