簡體   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