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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:26:13