我正在創建一個記錄日期、時間和溫度的溫度記錄器程式。該程式應創建一個新的 .csv 檔案,其中包括資料和列標題。但是我發現很難將標題添加到新檔案中。我嘗試使用兩個 while 回圈,一個在另一個之前,檔案似乎沒有附加標題,但記錄資料正常。然后我試圖嵌套在一個if陳述句中,它寫了標題,但也將它們添加到每個新資料行的末尾(見下圖)。
我的代碼如下:
datetime1 = str(datetime.now())
#create new file with datestamp
extension = ".csv"
file_name = datetime1 extension
file1 = open(file_name, 'a')
#add header to .csv
header = str("Date,Time,Minutes,InletTemp,ControlTemp,BedTemp,OutletTemp")
#x = 1
#while x >= 1:
# file1 = open(file_name, 'a')
# file1.write(header)
# x -= 1
#start button function
def start():
while(1):
x = 1
if x >= 1:
file1 = open(file_name, 'a')
file1.write(header)
#gather the data from each thermocouple
t1 = THERMO.getTEMP(0,1)
t2 = THERMO.getTEMP(0,2)
t3 = THERMO.getTEMP(0,3)
t4 = THERMO.getTEMP(0,4)
#themoplate LED cycle
THERMO.toggleLED(0)
#write sensor data to a file
datetime2 = datetime.now()
data = str(datetime2) ',' ' ' str(t1) ',' str(t2) ',' str(t3) ',' str(t4)
file1 = open(file_name, 'a')
file1.write('\n')
file1.write(data)
#write sensor data to the console
print (str(datetime2))
print ('Temperature on Channel 1:',t1)
print ('Temperature on Channel 2:',t2)
print ('Temperature on Channel 3:',t3)
print ('Temperature on Channel 4:',t4)
time.sleep(1)
while帶有嵌套if陳述句的回圈:

uj5u.com熱心網友回復:
像這樣的東西更接近你想要的。這會使檔案持續打開。如果您不喜歡那樣,請file1.close()在列印標題之后、file1=open(file_name, 'a')寫入資料之前和file1.close()之后執行。
datetime1 = str(datetime.now())
#create new file with datestamp
extension = ".csv"
file_name = datetime1 extension
#add header to .csv
header = "Date,Time,Minutes,InletTemp,ControlTemp,BedTemp,OutletTemp"
#start button function
def start():
file1 = open(file_name, 'w')
print(header, file=file1)
while(1):
#gather the data from each thermocouple
t1 = THERMO.getTEMP(0,1)
t2 = THERMO.getTEMP(0,2)
t3 = THERMO.getTEMP(0,3)
t4 = THERMO.getTEMP(0,4)
#themoplate LED cycle
THERMO.toggleLED(0)
#write sensor data to a file
datetime2 = datetime.now()
data = ','.join( (str(datetime2), str(t1), str(t2), str(t3), str(t4) )
print( data, file=file1)
#write sensor data to the console
print (str(datetime2))
print ('Temperature on Channel 1:',t1)
print ('Temperature on Channel 2:',t2)
print ('Temperature on Channel 3:',t3)
print ('Temperature on Channel 4:',t4)
time.sleep(1)
uj5u.com熱心網友回復:
在我看來,您在每一行之后重新打開并重新添加檔案頭,這意味著標題會連接到每一行的末尾。要解決此問題,請修復您的 while 回圈,如下所示:
def start():
x = 1
while 1:
if x == 1:
file1 = open(file_name, 'w')
file1.write(header)
file1.close()
# ...etc
這樣,您只在回圈開始時只寫入一次標題,而不是每次記錄讀數時。我還建議close()您每次完成寫入檔案時呼叫。
uj5u.com熱心網友回復:
您x=1在 while(True) 回圈的開頭設定并且它永遠不會更新,這就是它被添加到每一行的原因。
我認為您應該首先以寫入模式打開檔案,例如:
with open(file_name, 'w') as file1:
file1.write(header)
這將洗掉以前的資料并寫入您的標題。然后在執行 ( ) 時以追加模式在 while(True) 之前打開檔案一次file1 = open(file_name, 'a')。
uj5u.com熱心網友回復:
更簡潔的解決方案是使用csv模塊來寫入資料。在開始時打開檔案一次寫入標題,然后附加收集的新資料:
from datetime import datetime
import csv
import time
now = datetime.now()
filename = f'sensors_{now:%Y%m%d%H%M%S}.csv'
# Write mode to start a new file
with open(filename, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow('Date Time Minutes InletTemp ControlTemp BedTemp OutletTemp'.split())
def start():
while True:
# Simulate data
t1,t2,t3,t4 = 45.1,45.2,45.3,45.4
# collect column data in a list
now = datetime.now()
row = [now.strftime('%Y-%m-%d'),now.strftime('%H:%M:%S.%f'),'',t1,t2,t3,t4]
# append new data
with open(filename, 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(row)
# Write sensor data to the console
print(now)
print('Temperature on Channel 1:',t1)
print('Temperature on Channel 2:',t2)
print('Temperature on Channel 3:',t3)
print('Temperature on Channel 4:',t4)
time.sleep(1)
start()
示例輸出:
sensors_20211028094726.csv:
Date,Time,Minutes,InletTemp,ControlTemp,BedTemp,OutletTemp
2021-10-28,09:47:26.710602,,45.1,45.2,45.3,45.4
2021-10-28,09:47:27.718613,,45.1,45.2,45.3,45.4
2021-10-28,09:47:28.734657,,45.1,45.2,45.3,45.4
2021-10-28,09:47:29.750682,,45.1,45.2,45.3,45.4
uj5u.com熱心網友回復:
在程式頂部匯入 csv #
然后使用DictWriter構建 CSV。這將為您放入標題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342622.html
