Сравните значения с именами полей перед записью в CSV-файл с использованием Python
Я использую этот код для сравнения значений с их именами связанных полей перед тем, как сохранить его в csv-файле для проверки правильного столбца, потому что каждый раз, когда я перезагружаю свою машину, порядок датчиков в словаре будет изменяться автоматически. вот почему мне нужно контролировать положение значения в dict, прежде чем я сохраню его в файле csv, в противном случае я получу файл csv беспорядка, как в приведенном ниже примере, в котором значение temperatur равно 1000 [°C], яркость 10 [люкс]
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
Пример текста CSV
Time,Stromzaehler Strom L1 [A],Stecker Energy,1OG Ultraviolet,Stecker EG Energie [кВтч] 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 ответ
for sensor, value in data.items():
if sensor in data.items()==sensor in fieldnames:
v = data[sensor]
print("v", v)
lineValue+= str(v) + ","
Это не выглядит правильным для меня. Если вы просто хотите перебрать все имена полей (кроме "Время") и добавить значения в data
которые соответствуют этим полям, и в то же время ставят "н / п" для значений, отсутствующих в 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")
Предложение бонуса: если эти решения добавляют лишние пустые строки между ненужными строками, вы открываете файл с помощью newline=""
аргумент (если используется Python 3):
with open(filename,'a', newline="") as outfile:
... Или открыть файл в двоичном режиме (если используется Python 2):
with open(filename,'ab') as outfile: