为什么我得到ValueError时编辑我的csv文件?



我想在csv文件中保存我想要的值。如果文件是第一次记录,头文件名将首先保存。但是,当我运行我的代码,我得到以下错误。你认为原因是什么?

谢谢你的帮助

错误:

Traceback (most recent call last):
File "C:/Users/Yunus/PycharmProjects/binance_test/main.py", line 40, in <module>
save_position('ETHUSDT', 'timestamp', 'datetime', 'SELL', '63', '0.034', '3244.11', '3228.44', 'WON', '93.1233223')
File "C:/Users/Yunus/PycharmProjects/binance_test/main.py", line 20, in save_position
positions = list(read_positions())
File "C:Anaconda3libcsv.py", line 110, in __next__
self.fieldnames
File "C:Anaconda3libcsv.py", line 97, in fieldnames
self._fieldnames = next(self.reader)
ValueError: I/O operation on closed file.

代码:

import csv

def read_positions():
with open('positions.csv', 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
return 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):
with open('positions.csv', 'a', newline='') as csv_file:
fieldnames = ['pos_symbol', 'pos_timestamp', 'pos_datetime', 'pos_direction', 'pos_leverage', 'pos_quantity',
'pos_take_profit', 'pos_stop_loss', 'pos_result', 'usdt_balance']
csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
positions = list(read_positions())
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')

由于您在read_positions()中使用with,因此当它返回时将自动关闭文件。因此,当list()尝试遍历返回值以将其转换为列表时,它会尝试从已关闭的文件中读取。

您应该更改read_positions()以返回列表,而不是在调用者中转换它。

def read_positions():
with open('positions.csv', 'r') as csv_file:
csv_reader = csv.DictReader(csv_file)
return list(csv_reader)

最新更新