如何解决Python中ValueError: invalid literal for int() with base 10错误?
修复方案
问题分析
- 异常捕获范围错误:原代码把函数定义包裹在
try块中,但实际报错发生在函数调用阶段,这个try块根本捕获不到运行时的转换错误。 - 未处理空白字符:读取的
lines[i]包含换行符(\n),直接用int()转换会失败,必须先去除前后空白。 - 未处理非法输入:如果
test.txt行数为奇数,或者某行不是合法数字,会触发索引越界或转换失败。 - 变量命名冲突:函数内部用
encrypt作为变量名,和函数名重名,易引发混淆。
修复后的代码
def encrypt(file): result = "" with open(file, "r") as f: # 过滤空行并去除每行前后空白,避免换行符干扰 lines = [line.strip() for line in f.readlines() if line.strip()] # 校验行数是否为偶数,防止索引越界 if len(lines) % 2 != 0: raise ValueError("文件行数必须为偶数,每一行数字对应下一行单词") for i in range(0, len(lines), 2): count_str = lines[i] # 校验当前行是否为合法数字 if not count_str.isdigit(): raise ValueError(f"第{i+1}行不是合法数字:{count_str}") count = int(count_str) word = lines[i+1] # 校验数字是否超过单词长度,避免无效切片 if count > len(word): raise ValueError(f"第{i+1}行的数字{count}超过对应单词{word}的长度") result += word[:count] + " " return result.strip() if __name__ == '__main__': try: encrypted_string = encrypt("test.txt") print(encrypted_string) except Exception as e: print(f"错误:{e}") finally: print(" ") print("hello world")
关键修复点
- 把函数调用逻辑放到
try块中,确保运行时错误能被捕获。 - 预处理文件行,过滤空行并去除空白字符,解决换行符导致的转换失败问题。
- 添加多层输入校验:检查行数奇偶性、数字合法性、数字与单词长度匹配性,提前抛出明确错误。
- 重命名函数内的变量,避免和函数名冲突。
测试用例(test.txt内容示例)
3 hello 2 world
运行后输出:hel wo
内容的提问来源于stack exchange,提问作者CoderCoder
相关产品推荐
相关产品推荐

