繁体   English   中英

Python 只打印到 csv 中的一个单元格

[英]Python only prints to one cell in a csv

我正在尝试为我正在制作的 GUI 制作一个打印按钮。 现在,当我单击打印按钮时,它会将所有数据存储到我要打印的每个变量的一个单元格中。 现在我正在尝试打印时间、转速、扭矩和马力。 它会给我每个人在他们自己单独的单元格中,但它不会开始新的一行。 在此单元格中,格式为:[1,2,3,4,5,...]。 括号也位于单元格中。 我希望将它们分成几行,这样 GUI 的用户就可以将数据用于后期处理。 我在这个问题上主要发现的是人们试图将单词放入不同的单元格中,我知道字符的行为与数字不同,pr人们希望值位于单个单元格中,而不是像我的情况相反。

我现在拥有的是打印按钮将打印具有唯一时间戳的文件。 这样用户就可以保留这些数据以确保安全。

先感谢您!

"""
SCSU DYNO GUI PROGRAM

created 11/10/2017

"""


import sys
import time
from time import gmtime, localtime, strftime

import csv
import numpy as np
import warnings
import serial
import serial.tools.list_ports
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QThread,QTimer, pyqtSignal
from PyQt5.QtWidgets import QMessageBox,QWidget, QApplication,QHBoxLayout
from PyQt5.QtGui import QColor
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg
import random
from DynoTest1 import Ui_DynoTest1


__author__ = 'Matt Munn'

pg.setConfigOption('background', None)
pg.setConfigOption('foreground', 'k')

class GetData(QThread):
    dataChanged = pyqtSignal(float, float, float, float, float, float, float, float)

    #Distance = 0.5 #This is dependent on the lever arm.

    def __init__(self, parent=None):
        QThread.__init__(self, parent)

        arduino_ports = [  # automatically searches for an Arduino and selects the port it's on
            p.device
            for p in serial.tools.list_ports.comports()
            if 'Arduino' in p.description
        ]

        if not arduino_ports:
            raise IOError("No Arduino found - is it plugged in? If so, restart computer.")
        if len(arduino_ports) > 1:
            warnings.warn('Multiple Arduinos found - using the first')
        self.Arduino = serial.Serial(arduino_ports[0], 9600, timeout=1)

    def __del__(self):  # part of the standard format of a QThread
        self.wait()

    def run(self):  # also a required QThread function, the working part
        self.Arduino.close()
        self.Arduino.open()

        self.Arduino.flush()
        self.Arduino.reset_input_buffer()
        start_time = time.time()

        Distance = 1 #This is dependent on the lever arm.
        Max_RPM = 0
        Max_Horsepower = 0
        Max_Torque = 0
#This is what does the work to get the data from the arduino and then converts it to the other needed values.
        while True:
            while self.Arduino.inWaiting() == 0:
                pass
            try:
                data = self.Arduino.readline()
                dataarray = data.decode().rstrip().split(',')
                self.Arduino.reset_input_buffer()
                Force = round(float(dataarray[0]), 3)
                RPM = round(float(dataarray[1]), 0)
                if Max_RPM < RPM:
                    Max_RPM = RPM
                Torque = round(Force * Distance, 2)
                if Max_Torque < Torque:
                    Max_Torque = Torque
                Horsepower = round(Torque * RPM / 5252, 2)
                if Max_Horsepower < Horsepower:
                    Max_Horsepower = Horsepower
                Run_Time = round(time.time() - start_time, 1)
                print(Force, 'Grams', ",", RPM, 'RPMs', ",", Torque, "ft-lbs", ",", Horsepower, "hp", Run_Time,
                      "Time Elasped")
                self.dataChanged.emit(Force, RPM, Max_RPM, Torque, Max_Torque, Horsepower, Max_Horsepower, Run_Time)
            except (KeyboardInterrupt, SystemExit, IndexError, ValueError):
                pass


class GUI(QWidget, Ui_DynoTest1):
    def __init__(self, parent=None, border = None):
# This is what is used to make the graph.        
        QWidget.__init__(self, parent)
        self.setupUi(self)
        self.thread = GetData(self)
        self.thread.dataChanged.connect(self.onDataChanged)
        self.thread.start()
        self.rpm = []
        self.torque = []
        self.horse_power = []
        self.time = []
        self.counter = 0

        layout = QHBoxLayout()
        self.plot = pg.PlotWidget()
        layout.addWidget(self.plot)
        self.plot.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
        self.graphicsView.setLayout(layout)

        self.p1 = self.plot.plotItem
        self.p1.setLabels(left='Torque (ft-lbs)', bottom= 'Time (sec)')
        self.TorqueCurve = self.p1.plot()
        self.TorqueCurve.setPen(pg.mkPen(QColor(0,0,0), width=2.5))

        self.p2 = pg.ViewBox()
        self.HorsePowerCurve = pg.PlotCurveItem()
        self.HorsePowerCurve.setPen(pg.mkPen(QColor(0, 0, 255), width=2.5))
        self.p2.addItem(self.HorsePowerCurve)
        self.p1.scene().addItem(self.p2)
        self.p1.showAxis('right')
        self.p1.getAxis('right').setLabel('HorsePower', color='#0000ff')
        self.p1.getAxis('right').linkToView(self.p2)
        self.p1.vb.sigResized.connect(self.updateViews)

#This is where the buttons will be set up at.
        self.pushButton_4.clicked.connect(self.Print_Out)

    def Print_Out(self):

        #This gives a unique time stamp for each file made.
        outputFileName = "DynoData_#.csv"
        outputFileName = outputFileName.replace("#", strftime("%Y-%m-%d_%H %M %S", localtime()))

        with open(outputFileName, 'w',newline='') as outfile:
            outfileWrite = csv.writer(outfile, delimiter=',')
            #test = self.torque
            #test2 = self.torque , self.rpm
            outfileWrite.writerow([self.torque,self.horse_power,self.rpm,self.time])

    def updateViews(self):
        self.p2.setGeometry(self.p1.vb.sceneBoundingRect())
        self.p2.linkedViewChanged(self.p1.vb, self.p2.XAxis)

    def onDataChanged(self, Force, RPM, Max_RPM, Torque, Max_Torque, Horsepower, Max_Horsepower, Run_Time):
#These tell the program to display the values to the LCDs
        self.lcdNumber.display(Max_RPM)
        self.lcdNumber_2.display(Max_Torque)
        self.lcdNumber_3.display(Max_Horsepower)
        self.lcdNumber_4.display(RPM)
        self.lcdNumber_5.display(Torque)
        self.lcdNumber_6.display(Horsepower)
        self.lcdNumber_7.display(Run_Time)

        if self.counter < 50:
            self.torque.append(Torque)
            self.horse_power.append(Horsepower)
            self.time.append(Run_Time)
            self.rpm.append(RPM)
        else:
            self.torque = self.torque[1:] + [Torque]
            self.horse_power = self.horse_power[1:] + [HorsePower]
            self.time = self.time[1:] + [Run_Time]
            self.rpm = self.rpm[1:] + [RPM]
        self.HorsePowerCurve.setData(self.time, self.horse_power)
        self.TorqueCurve.setData(np.array(self.time), self.torque)
        self.updateViews()

#This is part of a standard closing script

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    Dyno = GUI()
    Dyno.show()
    sys.exit(app.exec_())

由于您的数据在列表中,您需要形成数据项的每个实例的行。 一种方法是使用zip转置列表:

>>> hp = [1,2,3]
>>> rpm = [4,5,6]
>>> time = [7,8,9]
>>> for row in zip(hp,rpm,time):
...  print(row)
...
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)

注意每个列表中的第一项是如何打印的,然后是第二项,依此类推。您可以使用它来将数据放入行中。 这是一个独立的示例:

import csv

class Test:
    def __init__(self):
        self.torque = [10,20,30]
        self.horse_power = [100,200,300]
        self.rpm = [1000,2000,3000]
        self.time = [1,2,3]

    def print(self):
        with open('test.csv','w',newline='') as outfile:
            outfileWrite = csv.writer(outfile)
            outfileWrite.writerow('Torque HP RPM Time'.split())
            outfileWrite.writerows(zip(self.torque,self.horse_power,self.rpm,self.time))

t = Test()
t.print()

注意writerows (复数)。 这需要一个列表列表。 writerow (singular) 需要一个列表并用于标题。 输出文件为:

Torque,HP,RPM,Time
10,100,1000,1
20,200,2000,2
30,300,3000,3

首先,根本不推荐在 python 中调用定义打印。 除非您确实想覆盖 python 'print'。 例如'print_to_csv'。

至于 csv,你需要将你的数据分组到 [扭矩、马力、转速、时间] 列表中,这样你的数据就会看起来像这样,

data_lists = [
   [torque(0), horsepower(0), rpm(0), time(0)],
   [torque(1), horsepower(1), rpm(1), time(1)],
   ...
   [torque(n), horsepower(n), rpm(n), time(n)]
]

然后你将遍历这个数据列表并像这样一一打印你的行,

for d in data_datalist:
   outfileWrite.writerow([d[0],d[1],d[2],d[3])

当然,构建数据的方法有很多,这只是一个例子。

希望这会有所帮助。

暂无
暂无

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

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