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

Flask注册追加CSV文件时触发OSError: [Errno 9]错误求助

Flask注册时CSV文件追加失败:OSError: [Errno 9] Bad file descriptor

我正在开发一个带登录、注册页面的简易Flask网站,登录功能通过CSV存储用户信息进行验证,运行正常。但注册页面完成用户名密码验证后,尝试将用户输入的账号密码追加到CSV文件时触发错误:OSError: [Errno 9] Bad file descriptor,报错行是打开CSV文件进行追加的代码。试过手动关闭文件、改用pandas操作等方法都没解决,暂时用TXT文件替代存储,现在求解决CSV追加的错误问题。

可复现代码

@app.route('/register',methods=["GET","POST"])
def register():
    if request.method == "POST":
        import csv
        import os
        username = request.form['username']
        pwd = request.form['password']
        with open('username_pw.csv', 'a') as read:
            reader = csv.writer(read,delimiter=",")
            reader.writerow([username,pwd])
        return render_template('login.html',msg=msg)
    return render_template('register.html')

错误回溯信息

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\robms\Documents\School\Python\Lib\site-packages\flask\app.py", line 2528, in wsgi_app
    response = self.full_dispatch_request()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\robms\Documents\School\Python\Lib\site-packages\flask\app.py", line 1825, in full_dispatch_request
    rv = self.handle_user_exception(e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\robms\Documents\School\Python\Lib\site-packages\flask\app.py", line 1823, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\robms\Documents\School\Python\Lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\robms\Documents\School\Python\Programs\flask\wk_7_lab\wk_7_lab.py", line 77, in register
    with open('username_pw.csv', 'a') as read:
OSError: [Errno 9] Bad file descriptor
127.0.0.1 - - [03/Mar/2023 17:22:04] "POST /register HTTP/1.1" 500 -

临时替代方案代码

追加文件

file = open("user_pw.txt","a")
file.write(username+" "+pwd+"\n")

读取文件

for line in open("user_pw.txt","r").readlines():
    login_info = line.split()
    if username == login_info[0] and pwd == login_info[1]:
        return True
return False

可能的解决方法

  • 使用绝对路径定位文件:Flask运行时的工作目录可能和你预期不一致,导致找不到文件或权限问题。可以通过绝对路径指定CSV文件位置:
    import os
    # 获取当前脚本所在目录的绝对路径
    csv_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'username_pw.csv')
    with open(csv_path, 'a', newline='', encoding='utf-8') as csv_file:
        writer = csv.writer(csv_file, delimiter=",")
        writer.writerow([username,pwd])
    
  • 完善文件操作参数:追加CSV时建议指定newline=''(避免Windows下写入后出现空行),同时显式指定编码格式,避免编码冲突。另外变量名read用于写入流容易混淆,建议改为csv_file这类语义明确的名称。
  • 排查文件句柄泄漏:检查项目中其他操作username_pw.csv的代码(比如登录验证的读取逻辑),确保所有文件操作都通过with上下文管理器正确关闭,避免文件被占用锁定。也可以用系统工具(比如Windows资源监视器)查看该文件是否被其他进程占用。
  • 检查文件权限:确认运行Flask的用户对username_pw.csv所在目录有写入权限,避免因权限不足导致文件打开失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:15:00