#python #python-3.x #csv
#python #python-3.x #csv
Вопрос:
Я пытаюсь записать свои данные, поступающие с arduino, в csv в чистом, удобном для пользователя формате. Я хочу, чтобы мои данные печатались в том виде, в каком они поступили, и им присваивался заголовок, чтобы пользователь мог видеть, что представляют столбцы. Прямо сейчас, когда я печатаю его в csv, я получаю заголовок на каждой итерации. Что произойдет, я получу:
Newtons
#
Newtons
#
Я пробовал использовать csv.writer и csv.DictWriter, и оба дают одинаковый результат.
Для контекста у меня есть arduino, собирающий данные с датчика, а затем python сообщает arduino, что делать, на основе показаний датчика, и я хочу сохранить эти показания датчика для анализа.
Код Python
import serial
import csv
import time
from time import localtime, strftime
import warnings
import serial.tools.list_ports
__author__ = 'Matt Munn'
arduino_ports = [
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')
Arduino = serial.Serial(arduino_ports[0],9600,timeout=1)
time.sleep(2)
start_time=time.time()
Force = []
Actuator_Signal=[]
numPoints = 10
ForceList = [0]*numPoints
AvgForce = 0
#This creates the unique file for saving test result data.
outputFileName = "Cycle_Pull_Test_#.csv"
outputFileName = outputFileName.replace("#", strftime("%Y-%m-%d_%H %M %S", localtime()))
with open(outputFileName, 'w',newline='') as outfile:
#This takes the data from the arduino and interprits it.
while True:
while (Arduino.inWaiting()==0):
pass
try:
data = Arduino.readline()
dataarray = data.decode().rstrip().split(',')
for i in range(0,numPoints):
Force = round(float(dataarray[0]),3)
ForceList[i] = Force
AvgForce = round((sum(ForceList)/numPoints),3)
print (AvgForce)
#This Controls the actuators direction based on the force input on the loadcell.
if AvgForce >50:
Arduino.write(b'd')
else:
Arduino.write(b'u')
except (KeyboardInterrupt, SystemExit,IndexError,ValueError):
pass
#This writes the data from the loadcell to a csv file for future use.
HeaderNames = ['Newtons']
outfileWrite = csv.DictWriter(outfile, fieldnames = HeaderNames)
outfileWrite.writeheader()
outfileWrite.writerow({'Newtons' : [AvgForce]})
Комментарии:
1. Выведите определение
outfileWrite
и вызовoutfileWrite.writeheader()
из цикла.
Ответ №1:
Проблема в том, что ваше определение выходного файла и вызов writeheader()
находятся в цикле
Это должно сработать:
#This takes the data from the arduino and interprits it.
outfileWrite = csv.DictWriter(outfile, fieldnames = HeaderNames)
outfileWrite.writeheader()
while True:
# Rest of the while loop