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

操作CSV文件写入数据时报ValueError:I/O操作在已关闭文件的原因是什么

错误原因

  • 核心问题来自read_positions的实现:Python中with open()语法是上下文管理器,执行完缩进块内的代码后会自动关闭打开的文件。你的函数只返回了csv.DictReader实例,还没实际读取文件内容,当外部调用list(read_positions())尝试迭代读取数据时,绑定的文件已经被关闭,所以触发I/O操作异常。
  • 额外隐藏问题:首次运行时positions.csv还不存在,直接调用读文件的函数会直接报文件不存在错误,原本写表头的逻辑无法触发。

修正方案

调整读取逻辑,在文件打开的上下文管理器内就完成内容读取,同时补充文件不存在的边界兼容,修改后的完整代码如下:

import csv
import os

def read_positions():
    # 文件不存在直接返回空列表,兼容首次运行场景
    if not os.path.exists('positions.csv'):
        return []
    with open('positions.csv', 'r') as csv_file:
        csv_reader = csv.DictReader(csv_file)
        # 打开文件期间就读取所有内容到内存,返回的列表不依赖文件句柄状态
        return list(csv_reader)


def save_position(pos_symbol, pos_timestamp, pos_datetime, pos_direction, pos_leverage, pos_quantity, pos_take_profit,
                  pos_stop_loss, pos_result, usdt_balance):
    # 提前读取现有内容,避免同一文件同时持有读写句柄产生冲突
    positions = read_positions()
    fieldnames = ['pos_symbol', 'pos_timestamp', 'pos_datetime', 'pos_direction', 'pos_leverage', 'pos_quantity',
                  'pos_take_profit', 'pos_stop_loss', 'pos_result', 'usdt_balance']

    with open('positions.csv', 'a', newline='') as csv_file:
        csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        # 无现有内容时写入表头
        if len(positions) < 1:
            csv_writer.writeheader()
        csv_writer.writerow({
            'pos_symbol':pos_symbol,
            'pos_timestamp':pos_timestamp,
            'pos_datetime':pos_datetime,
            'pos_direction':pos_direction,
            'pos_leverage':pos_leverage,
            'pos_quantity':pos_quantity,
            'pos_take_profit':pos_take_profit,
            'pos_stop_loss':pos_stop_loss,
            'pos_result':pos_result,
            'usdt_balance':usdt_balance
        })


save_position('ETHUSDT', 'timestamp', 'datetime', 'SELL', '63', '0.034', '3244.11', '3228.44', 'WON', '93.1233223')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:36:05