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

Python统计文本文件E/e、T/t出现次数时遇TypeError报错求助

问题:统计文本文件中E/e、T/t的出现次数时触发TypeError

原代码与错误信息

你编写的统计字符的代码如下:

def test():
    f = open("poem.txt",'r')
    count = 0
    count1 =0
    try:
        line = f.readlines()
        for i in line:
            for x in line:
                if (i[x] in 'Ee'):
                    count+=1
                else:
                    if (i[x] in 'Tt'):
                        count1+=1
        print("E or e",count)
        print("T or t",count1)
    except EOFError:
        f.close()
test()

运行后触发错误:

File "/Users/ansusinha/Desktop/Tution/Untitled15.py", line 23, in test
    if (i[x] in 'Ee'):
TypeError: string indices must be integers

错误原因分析

核心问题出在嵌套循环的逻辑错误:

  • line = f.readlines()会返回一个列表,每个元素是文件中的一行字符串。
  • 外层循环for i in line中,i代表文件的某一行(字符串类型)。
  • 但你在内层写了for x in line,这会让x遍历整个行列表的每一行(同样是字符串),而非当前行i里的单个字符。
  • 当你执行i[x]时,相当于用字符串作为索引去访问另一个字符串,而字符串的索引必须是整数,因此触发TypeError。

除此之外,代码还有两处不规范的地方:

  1. 文件关闭逻辑不可靠:try-except块仅捕获EOFError,如果触发其他异常,文件无法正常关闭。
  2. 变量命名不清晰:count和count1无法直观对应统计的字符。

修正后的代码

def test():
    count_e = 0
    count_t = 0
    # 使用with语句自动管理文件上下文,无需手动调用close()
    with open("poem.txt", 'r') as f:
        # 逐行读取文件
        for line in f:
            # 遍历当前行的每个字符
            for char in line:
                if char in 'Ee':
                    count_e += 1
                elif char in 'Tt':
                    count_t += 1
    print("E or e:", count_e)
    print("T or t:", count_t)

test()

关键修改说明

  • 修正内层循环:将for x in line改为for char in line,直接遍历当前行的每个字符,避免索引错误。
  • 使用with语句:自动处理文件的打开与关闭,无论代码是否触发异常,都能保证文件正常关闭,比手动close()更安全。
  • 优化变量命名:用count_e和count_t替代模糊的count和count1,提高代码可读性。
  • 简化判断逻辑:用elif替代嵌套else-if,让代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:15:35