2017-10-18 351 views
0

我使用Python 3.5和我有麻煩一點點嘗試打印我的實時數據到CSV進行後處理。我正在使用Arduino從應變計和照片傳感器收集數據,以便爲我的學校車隊實時更新Dyno。到目前爲止,我已經設法將最後一行數據打印成CSV,但這還不夠。寫作生活,從一個Arduino數據到CSV在Python

我需要球隊與他們的測試,看看他們所做的修改對發動機做了之後它打印所有的數據。我確實已將所有相關數據顯示在串行監視器中,但如果他們能夠獲得用於查看以前測試的數據,那麼這對他們來說會很好。

import serial 
import csv 
import time 
import numpy as np 
import warnings 
import serial 
import serial.tools.list_ports 

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") 
if len(arduino_ports) > 1: 
    warnings.warn('Multiple Arduinos found - using the first') 

Arduino = serial.Serial(arduino_ports[0]) 
Arduino.flush() 
Arduino.reset_input_buffer() 

start_time=time.time() 
Distance = 0.5 # This is how long the lever arm is in feet 

while True: 
    while (Arduino.inWaiting()==0): 
     pass 
    try: 
     data = Arduino.readline() 
     dataarray = data.decode().rstrip().split(',') 
     Arduino.reset_input_buffer() 
     Force = float(dataarray[0]) 
     RPM = float (dataarray[1]) 
     Torque = Force * Distance 
     HorsePower = Torque * RPM/5252 
     Run_time = time.time()-start_time 
     print (Force , 'Grams',"," , RPM ,'RPMs',"," ,Torque,"ft-lbs",",", HorsePower, "hp", Run_time, "Time Elasped") 
    except (KeyboardInterrupt, SystemExit,IndexError,ValueError): 
     pass 
    with open('DynoData.csv', 'w') as outfile: 
     outfileWrite = csv.writer(outfile) 
     outfileWrite.writerow([Force, RPM]) 

    outfile.close() 

回答

1

你已經包裹你的文件打開和關閉while循環的內部代碼:with塊。要一階近似,with語句使用上下文管理確保「發生什麼事,不管是什麼」。在這種情況下,它確保文件在with塊結束後立即關閉。這有創建文件(名爲DynaData.csv)爲每次循環的作用,因而是生存的唯一數據是寫入數據的最後一塊,您的CSV輸出的單行。

注意,這意味着你試圖關閉文件:

outfile.close() 

是多餘的,在最好的,如果解釋不直接拋出異常。

如果你想不斷地寫入到文件作爲數據進來,附上您while循環with open...塊內:

with open('DynoData.csv', 'w') as outfile: 
    outfileWrite = csv.writer(outfile) 
    while True: 
     ... 
     # code to collect your data omitted 
     ... 
     outfileWrite.writerow([Force, RPM]) 

爲了完整起見,請注意,你可以在每次迭代可選outfile.flush()爲好。該文件將刷新寫入的每個換行符處的未寫入緩衝區,或者無論如何內部緩衝區已滿時,請嘗試是否需要或想要。

+0

這似乎已經解決了我的問題,但是當它保存的信息好像還行之間的空白。這不是一個關鍵的問題,但是要有一個整齊的電子表格來顯示他們所有的數據,我認爲最好不要在每行之間留出空格。例如,具有20個數據點的樣本集將使用40行。 –

+0

只是指出一個錯誤在什麼我給你:移動'= csv.writer(OUTFILE)'來_outside_ while循環。顯然不是有害的,因爲它的工作,但不正確。這是我能看到的額外換行符的唯一來源。現在只有一條寫入文件的語句。看看是否解決了你的問題? – hunteke

+0

可悲的是,輸出文件沒有發生變化,但我很欣賞知道如何使代碼的這部分成爲可能。 –