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。
除此之外,代码还有两处不规范的地方:
- 文件关闭逻辑不可靠:
try-except块仅捕获EOFError,如果触发其他异常,文件无法正常关闭。 - 变量命名不清晰:
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
相关产品推荐
相关产品推荐

