在使用python将其写入csv文件之前,将值与字段名进行比较

时间:2017-11-21 11:44:41

标签: python csv dictionary field-names

我使用此代码将值与其附属字段名进行比较,然后将其存储在csv文件中以检查右列,因为每次重新启动计算机时,字典中的传感器顺序都将自动更改。这就是为什么我必须在将它存储在csv文件中之前控制dict中值的位置,否则我将得到一个混乱的csv文件,如示例波纹管提供的值温度为1000 [°C]发光度10 [lux]

import csv
from datetime import datetime
import os
import time
from collections import OrderedDict
from time import sleep


Datum = time.strftime("%Y-%m-%d")
Time = datetime.now().replace(microsecond=0).isoformat()

data = {'Stecker Energy': '2.37', 'Stromzaehler Strom L1 [A]': '0.0', '1OG Ultraviolet': '0.0','Stecker EG  Energie [kWh]': '4.3'}

filename = Datum + 'SOF.csv'
if not os.path.isfile(filename):
    outfile = open(filename, "w")
    lineKey = ""
    for x in data.keys():
        lineKey+= x + ","
    lineKey = 'Time '+ "," + lineKey[:-1]+"\n" # Delete last character and add new line
    outfile = open(filename, "a")
    outfile.write(lineKey)
    outfile.close()

#check first line of  fieldnames 
with open(filename,'r') as myFile:
    reader = csv.DictReader(myFile)
    fieldnames = reader.fieldnames
    myFile.close()
#Compare the values with their  keys (fieldnames)
with open(filename,'a') as outfile:
    lineValue = ""
    for sensor, value  in data.items():
        if sensor in data.items()==sensor in fieldnames:
            v = data[sensor]
            print("v", v)
            lineValue+= str(v) + "," 
    lineValue = Time + "," + lineValue[:-1] + "\n"
    print(lineValue)
    outfile.write(lineValue)
    outfile.close()

问题是,当我检查CSV文件时,我发现值写在错误的列中,这意味着Examlpe的字段名错误:

CSV文件中此问题的示例

Example of this problem in csv file

CSV文字示例

时间,Stromzaehler Strom L1 [A],Stecker Energy,1G Ultraviolet,Stecker EG Energie [kWh] 2017-11-21T17:56:10,2.37,0.0,0.0,4.3 2017-11-21T17:56:26,4.3,0.0,0.0,2.37 2017-11-21T17:56:28,0,0.0,2.37,4.3 2017-11-21T17:56:30,0,2.37,0.0,4.3

data = {'Stecker Energy': '', 'Stromzaehler Strom L1 [A]': '', '1OG Ultraviolet': '','Stecker EG  Energie [kWh]': ''}

1 个答案:

答案 0 :(得分:1)

for sensor, value  in data.items():
    if sensor in data.items()==sensor in fieldnames:
        v = data[sensor]
        print("v", v)
        lineValue+= str(v) + "," 

这对我来说不合适。如果您只想迭代所有字段名(“时间”除外)并在data中添加与这些字段对应的值,同时为{{1}中不存在的值添加“n / a”那我建议做:

data

奖金建议:手动在值之间添加逗号是一种容易出错的方法。如果可能,请使用with open(filename,'a') as outfile: lineValue = "" for fieldname in fieldnames[1:]: #skip the first one, since that's Time, which we have a custom value for already. v = data.get(fieldname, "n/a") lineValue += str(v) + "," lineValue = Time + "," + lineValue[:-1] + "\n" print(lineValue) outfile.write(lineValue) outfile.close() ,它可以解决大多数格式问题。

DictWriter

如果您坚持不这样做,至少将值存储在列表中,最后with open(filename,'a') as outfile: writer = csv.DictWriter(outfile, fieldnames) row = {} for fieldname in fieldnames: #no need to skip Time here, we'll just overwrite it later. row[fieldname] = data.get(fieldname, "n/a") row["Time "] = Time writer.writerow(row) 一次:

join

奖金奖励建议:如果这些解决方案在您不想要的行之间添加额外的空行,则使用with open(filename,'a') as outfile: values = [Time] for fieldname in fieldnames[1:]: v = data.get(fieldname, "n/a") values.append(str(v)) outfile.write(",".join(values) + "\n") 参数打开文件(如果使用Python 3):

newline=""

...或者以二进制模式打开文件(如果使用Python 2):

with open(filename,'a', newline="") as outfile: