如何在给定时间关闭CSV文件?

2024-09-28 01:29:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从串行端口读取数据并将其写入CSV文件,我还希望在00:00:00关闭该文件并自动创建另一个CSV文件以写入该文件。我尝试使用“datetime”模块和“if”条件,但没有结果,它没有进入条件,请帮助我

 import serial.tools.list_ports
 import csv
 import datetime 
 import os.path
 import os 
 
 def generateReport():
     day_counter = 1
     header_list = ['DateTime', 'Pressure_Inside', 'Pressure_outside','DeltaP', 
                    'Temperature_inside', 'Temperature_outside', 'DeltaT', 'Humidity_inside', 
                    'Humidity_outside', 'DeltaH']
     serialInst = serial.Serial()
     portVar = getPort()
     serialInst.port = "Add a port"
     serialInst.open()
     isRunning = True
     
     while isRunning:
         current_hour = datetime.datetime.now().strftime("%H:%M:%S")
         date = datetime.datetime.now().strftime("%Y-%m-%d")
         report_name = "Report_" + date + "_" + str(day_counter) + ".csv"

         try:
             if serialInst.in_waiting:
             packet = serialInst.readline()
             decoded_packet = packet.decode('utf')
             initial_string = decoded_packet
             splited_string = initial_string.split(";")
             print(splited_string)
             report_folder = "Add a folder"
             
             if os.path.isfile(report_folder + report_name):
                 with open(report_folder + report_name, "a", newline = "")as f:
                     now = datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S")
                     writer = csv.writer(f, delimiter=",")
                     writer.writerow([now, splited_string[0], splited_string[1], splited_string[2], splited_string[3], splited_string[4], splited_string[5], splited_string[6], splited_string[7], splited_string[8])
                     if current_hour == stop_hour:
                         print("A NEW REPORT WAS GENERATED WITH SUCCESS")
                         f.close()
                         day_counter += 1

            else:
                print("CREATE NEW REPORT")
                with open(report_folder + report_name, "w", newline="")as f:
                    writer = csv.writer(f, delimiter=",")
                    writer.writerow(headerList)
         except KeyboardInterrupt:
             print("Keyboard Interrupt")
             isRunning = False
def run():
    generateReport()
run()

`


Tags: 文件csvnameimportreportdatetimestringif
1条回答
网友
1楼 · 发布于 2024-09-28 01:29:15

无需深入了解代码的细节,您可以执行两个循环。外部循环基本上永远运行,而内部循环每天都会中断。大概是这样的:

from datetime import datetime

while True:
    current_day = datetime.now().day
    while True:
        # your code, reading from serial, writing to your file etc.
        print(f"Reading data on day {day_counter}")
        if datetime.now().day != current_day:
            current_day = datetime.now().day
            break

编辑:下面是一个基于分钟而非天的示例

from datetime import datetime
import time

# outer loop
while True:
    # initially set the current minute
    day_counter = datetime.now().minute

    # inner loop, breaking each minute
    while True:
        # your code, reading from serial, writing to your file etc.
        print(f"Reading data on minute {day_counter}")
        # sleep 5 seconds, just so i dont spam the console
        time.sleep(5)
        
        # if the current minute changes, break the inner loop
        if datetime.now().minute != day_counter:
            # overwrite the variable in the outer loop
            day_counter = datetime.now().minute
            break

    # your code when the minute has changed
    print("Warning - CHANGING TO A NEW EXCEL FILE !!")

相关问题 更多 >

    热门问题