在 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 时循环写入您的移动
- 打开文件进行写入
- 从文件
创建csv.Writer
- 写下你的header
- 循环你的动作
- 处理一个move/board
- 写入move/board
- 关闭文件
或者,处理附加到 data
的所有 moves/board,然后打开 CSV 文件并写入数据 writer.writerows(data)
:
- 循环你的动作
- 处理一个move/board
- 将其附加到
data
- 打开文件进行写入
- 从文件
创建csv.Writer
- 写下你的header
- 用
data
写入所有行
- 关闭文件
我正在尝试创建一个数据库来训练基本的机器学习算法。然而,当我 运行 代码时,它只创建两行,但我试图为游戏中的每个单独位置创建多行,并在该位置的末尾进行鳕鱼分析。代码似乎在进行三步移动,然后写入文件或为每一步覆盖文件。我分不清是哪一个。进一步详细说明,下面的示例是我编写的代码的输出,其中 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)
:
- 打开文件进行写入
- 从文件 创建csv.Writer
- 写下你的header
- 循环你的动作
- 处理一个move/board
- 写入move/board
- 关闭文件
或者,处理附加到 data
的所有 moves/board,然后打开 CSV 文件并写入数据 writer.writerows(data)
:
- 循环你的动作
- 处理一个move/board
- 将其附加到
data
- 打开文件进行写入
- 从文件 创建csv.Writer
- 写下你的header
- 用
data
写入所有行
- 关闭文件