操作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
相关产品推荐
相关产品推荐

