繁体   English   中英

如何从 python 模块代码制作 csv 文件?

[英]How can I make a csv file from a python module code?

注意 - 这不是关于从单个 csv 文件或 excel 文件制作 csv 文件,而是针对单个 Z23EEEB4347BDD26FCDDB 应用程序。

我正在处理一项任务,从井字游戏中制作 csv 文件,所以我制作了一些原始的 Python 模块和主代码,运行主代码时,结果的子数据临时保存。 (A-模块,B-主代码)。 每个信息都临时存储在结构 self 下的 like 'self.xxx' 中。 原python模块及主代码不可修改。

A-模块

class TTT_Env():
    def __init__(self):
        self.state = [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
        self.done = False
        self.turn = 'X'
        self.winner = None

    def print_state(self):
        for row in self.state:
            print(*row)

    def step(self, r, c):
        if r not in [0, 1, 2] or c not in [0, 1, 2]:      
            print('Enter the number 0~2')
        elif self.state[r][c] != '_': 
            print('Put your mark on the blank position!')
        else:
            self.state[r][c] = self.turn

            tmp = self.state[0]+self.state[1]+self.state[2]   
            if tmp.count('_') == 0:
                self.done = True

            self._winner_check()

            self.turn = 'O' if self.turn == 'X' else 'X' 

    def reset(self):
        self.state = [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
        self.done = False
        self.turn = 'X'
        self.winner = None

    def _winner_check(self):
        for row in self.state:
            if ''.join(row) == self.turn * 3:
                self.winner, self.done = self.turn, True

        for col in zip(*self.state): 
            if ''.join(col) == self.turn * 3:
                self.winner, self.done = self.turn, True

        diag_1 = self.state[0][0] + self.state[1][1] + self.state[2][2] 
        diag_2 = self.state[0][2] + self.state[1][1] + self.state[2][0]  
        if diag_1 == self.turn * 3 or diag_2 == self.turn * 3:      
            self.winner, self.done = self.turn, True

B- 主要代码

from TTT_env import *
from game_logger import *

env = TTT_Env()

print("Game start")
history = []
env.print_state()
while not env.done:
    action = input("Player %s, enter your index of your mark(compared by space):"%env.turn)
    r, c = action.split(' ')
    history.append(env.turn, int(r), int(c), env.done, env.winner)
    env.step(int(r), int(c))
    env.print_state()

logging(history)
if env.winner == None:
    print("Draw.")
else:
    print("The winner is player %s!"%env.winner)

目标在这里; (1) 我必须制作一个.csv 文件,其中包含自己临时存储的数据集。(原程序仍在运行)

(2) 当原程序结束时,我需要在 csv 文件上做一个记录。

下面的代码是我关于目标的原型之一,它有很多错误,我知道,但请多多指教。

谢谢!

因此,当我得到正确答案时,我惊讶地发现根本不使用 readlines function 也不 read 也不 readline function - 这是答案代码

import csv
import os
import datetime

def logging(history):
    if not os.path.isdir("log"):
        os.mkdir("log")

    if not os.path.exists("log/play_log.csv"):
        with open("log/play_log.csv", "w") as f:
            writer = csv.writer(f, delimiter=',', quotechar='"')
            header = ["step", "player", "row", "column", "done", "winner"]
            writer.writerow(header)

    with open("log/play_log.csv", "a") as f:
        writer = csv.writer(f, delimiter=',', quotechar='"')
        for i, p_r_c_d_w in enumerate(history):
            s_p_r_c_d_w = [i+1] + p_r_c_d_w
            writer.writerow(s_p_r_c_d_w)
        writer.writerow([str(datetime.datetime.now())])

首先我要做的是通过检查 os.path.isdir 语句来创建一个路径目录。 如果没有说明目录,则必须使用 os.mkdir 语句创建一个。

然后,使用 sub.csv 文件 'play_log.csv' 我必须制作一个分隔符和 quotechar 当然 - 制作一个 header 来比较之后哪个是正在进行的数据集。 我也必须在.csv 文件上写下来。

这段代码的最后一部分表示我们应该为历史日志的数据集腾出一个空间 - 通过将历史数据分发到 p_r_c_d_w,并且还通过在代码为时手动添加 1 使步骤(i)工作来比较最新记录在职的。

对于第 2 点,我们应该做一个 writerow 声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM