Python 3.6函数中出现NameError错误,请求排查与解决
问题分析与修复
咱们一步步拆解你代码里的问题:
1. 变量调用顺序完全搞反了
你在调用encrypt_file(filename)的时候,filename这个变量根本还没定义——获取用户输入的user_input = input('enter file name: ')语句在函数调用之后,Python找不到filename这个名字,自然就抛出NameError了。
2. 把文件名和文件对象搞混了
你的代码里写了:
file_content = filename.read() filename.close()
这里的filename是你传入的字符串(比如用户输入的文件名),它根本没有read()和close()方法!你应该用之前打开的open_file这个文件对象来执行这些操作。
3. 函数没返回值,文件资源管理不严谨
你的函数读了文件内容,但没把结果返回出来,后续根本没法用这个字符串;另外直接用open()加close()的写法,万一中间出异常,文件可能会没正常关闭,最好用with语句自动管理资源。
修正后的完整代码
def encrypt_file(filename): # 用with语句自动处理文件关闭,不用手动写close() with open(filename, 'r', encoding='utf-8') as open_file: file_content = open_file.read() return file_content # 返回读取到的文件内容字符串 # 先拿用户输入,再调用函数,顺序不能乱 user_input = input('enter file name: ') try: file_str = encrypt_file(user_input) print("文件已成功读取,内容如下:") print(file_str) except FileNotFoundError: print(f"出错啦:找不到文件 {user_input}") except Exception as e: print(f"读取文件时遇到问题:{e}")
关键改进点说明
- 调整执行顺序:先获取用户输入的文件名,再传入函数调用,彻底解决
NameError。 - 正确操作文件对象:用打开后的
open_file读取内容,不再对着字符串瞎操作。 with语句的优势:不管代码正常执行还是抛出异常,文件都会自动关闭,避免资源泄漏。- 添加异常处理:处理文件不存在这类常见错误,让程序不会轻易崩溃。
- 返回文件内容:函数返回读取到的字符串,方便你后续做加密操作(毕竟函数名叫
encrypt_file嘛)。
内容的提问来源于stack exchange,提问作者Gabe
相关产品推荐
相关产品推荐

