在 CSV file/Chess 数据库创建中创建多行

Creating more than one row in a CSV file/Chess database creation

我正在尝试创建一个数据库来训练基本的机器学习算法。然而,当我 运行 代码时,它只创建两行,但我试图为游戏中的每个单独位置创建多行,并在该位置的末尾进行鳕鱼分析。代码似乎在进行三步移动,然后写入文件或为每一步覆盖文件。我分不清是哪一个。进一步详细说明,下面的示例是我编写的代码的输出,其中 number = 3:

不过,我正在寻找这样的东西:

0 1 2 3 4 5 6 7 8
P P p p
P P p p
P P p p

这是我的代码:

import chess
import chess.engine
import random
import numpy
import csv
from stockfish import Stockfish

header = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]
data = []



def create_file(number):
  board = chess.Board()
  moves = 0
  turns = 0
  black_v = 0
  white_v = 0
  while moves < number:
    if chess.Board.is_game_over(board) == True:
      chess.Board.reset()
    if turns > 200:
      chess.Board.reset()
    for position in header:
      data.append(board.piece_at(position))

    with open('/content/Positions Data/position.csv', 'w', encoding='UTF8', newline='') as f:
        writer = csv.writer(f)
        header.append('sf')
        data.append((stockfish(board, 10))/100)
        writer.writerow(header)
        writer.writerow(data)
        data.clear()
        header.pop()
        turns = turns + 1
        moves = moves + 1
        random_move = random.choice(list(board.legal_moves))
        board.push(random_move)

正如 Camaendir 在评论中指出的那样,您在移动的每次迭代中都打开了输出文件。这将打开“用于创建”的文件,该文件将覆盖所有以前的数据。

此外,通过查看您的代码和您尝试做的事情,我发现有两种方法可以完成您想要的,而您同时尝试这两种方法,这会产生其他问题。

要么打开 CSV 文件进行写入,然后在使用 writer.writerow(stockfish(board, 10))/100):

处理 board/moves 时循环写入您的移动
  1. 打开文件进行写入
  2. 从文件
  3. 创建csv.Writer
  4. 写下你的header
  5. 循环你的动作
    1. 处理一个move/board
    2. 写入move/board
  6. 关闭文件

或者,处理附加到 data 的所有 moves/board,然后打开 CSV 文件并写入数据 writer.writerows(data):

  1. 循环你的动作
    1. 处理一个move/board
    2. 将其附加到 data
  2. 打开文件进行写入
  3. 从文件
  4. 创建csv.Writer
  5. 写下你的header
  6. data
  7. 写入所有行
  8. 关闭文件