【问题标题】:How to export comma separated object into a .csv file如何将逗号分隔的对象导出到 .csv 文件中
【发布时间】:2023-03-28 06:20:02
【问题描述】:

以下代码旨在将原始数据从指定的串行端口输出到 python shell 以及现在以 CSV 格式的修改数据,准备通过 csv.writer 输出到 .csv 文件中。但是,最终输出显示为 Fri Apr 23 21:30:05 2021 "19,62,0,0,25。您可能会发现这是不正确的,因为输出应该是 [time.asctime(time.localtime (time.time())),decoded_bytes] 转换为 Fri Apr 23 21:30:05 2021, 19,62,0,0,25。我不确定“”是如何添加的,也不知道为什么 python 认为日期时间对象的“19”部分并将其放在同一列中。任何帮助将不胜感激。

import serial
import time
import csv

#ser = serial.Serial('/dev/ttyUSB0', baudrate = 9600, timeout = 1)
ser = serial.Serial('COM4', baudrate = 9600)
ser.flushInput()

while True:
    
    ser_bytes = ser.readline()
    line = ser.readline().decode('utf-8')[:-1]
    decoded_bytes = line.replace(":","",5).replace("Soil Moisture","",1).replace("Humidity","",1).replace("CO2","",1).replace("ppm","",1).replace("ppb","",1).replace("%RH","",1).replace("Temp","",1).replace("EC","",1).replace("TVOC","",1).replace(" ","",8)

    if line:  # If it isn't a blank line
        print("Incoming DATA:")
        print(line)
        print(".csv DATA:")
        print(decoded_bytes)
        with open("test_data.csv","a") as f:
            writer = csv.writer(f,delimiter=" ")
            writer.writerow([time.asctime(time.localtime(time.time())),decoded_bytes])

示例 python shell 输出:

传入数据: 土壤湿度:22EC,湿度:62.00%RH,CO2:0ppm,TVOC:0ppb,温度:25.00

.csv 数据: 22,62.00,0,0,25.00

传入数据: 土壤湿度:18EC,湿度:62.00%RH,CO2:400ppm,TVOC:0ppb,温度:24.45

.csv 数据: 18,62.00,400,0,24.45

传入数据: 土壤湿度:15EC,湿度:62.00%RH,CO2:400ppm,TVOC:0ppb,温度:25.00

.csv 数据: 15,62.00,400,0,25.00

【问题讨论】:

    标签: python csv time arduino pyserial


    【解决方案1】:

    尝试调整此解决方案,看看是否有帮助。

    file_input.txt

    Soil Moisture: 22EC, Humidity: 62.00%RH, CO2: 0ppm, TVOC: 0ppb, Temp:25.00
    Soil Moisture: 18EC, Humidity: 62.00%RH, CO2: 400ppm, TVOC: 0ppb, Temp:24.45
    Soil Moisture: 15EC, Humidity: 62.00%RH, CO2: 400ppm, TVOC: 0ppb, Temp:25.00
    

    脚本

    import time
    
    
    
    import re
    
    def write_to_csv(list_input):
        import csv
        with open('file_output.csv', 'a', newline='') as myfile:
            wr = csv.writer(myfile, quoting=csv.QUOTE_NONNUMERIC)
            wr.writerow(list_input)
    
    def read_input(file_input):
        with open(file_input, 'r') as file_in:
            list_file = file_in.read().splitlines()
            for i in list_file:
                # Find the pattern
                res=re.findall(': ?(\d*\.?\d*)', i)
                # Convert the list to number
                res=list(map(float,res))
                time_stamp = time.asctime(time.localtime(time.time()))
                res.insert(0,time_stamp)
                write_to_csv(res)
    
    
    file_input = 'file_input.txt'
    read_input(file_input)
    
    

    file_output.csv

    "Fri Apr 23 10:29:11 2021",22.0,62.0,0.0,0.0,25.0
    "Fri Apr 23 10:29:11 2021",18.0,62.0,400.0,0.0,24.45
    "Fri Apr 23 10:29:11 2021",15.0,62.0,400.0,0.0,25.0
    

    【讨论】:

    • 我能够调整您的解决方案以获得以下输出:Fri Apr 23 23:13:32 2021, [7.0, 62.0, 0.0, 0.0, 25.72]。现在你可以看到所有的值都在第二列,时间在第一列。感谢您的解决方案,但是您的答案不包括时间戳,因此无法使用任何时间参考来绘制数据。
    • 该修复效果很好,我现在唯一的问题是它一次吐出 10 行左右,如果我可以让它每 2 秒只打印一行而不是每 2 秒打印 10 行秒我会将此标记为答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多