Python удалить строку из CSV на основе даты - PullRequest
0 голосов
/ 14 декабря 2018

Я использую python для сбора данных о температуре, но хочу сохранить данные только за последние 24 часа.

В настоящее время я создаю свой файл .csv с этим

while True:
    tempC = mcp.temperature
    tempF = tempC * 9 / 5 + 32
    timestamp = datetime.datetime.now().strftime("%y-%m-%d %H:%M   ")

    f = open("24hr.csv", "a")
    f.write(timestamp)
    f.write(',{}'.format(tempF))
    f.write("\n")
    f.close()

.CSV выглядит следующим образом

.csv, который выводит этот файл, выглядит следующим образом

18-12-13 10:58   ,44.7125
18-12-13 11:03   ,44.6
18-12-13 11:08   ,44.6
18-12-13 11:13   ,44.4875
18-12-13 11:18   ,44.6
18-12-13 11:23   ,44.4875
18-12-13 11:28   ,44.7125

Я не хочу переворачиваться, просто сохраняйте данные за последние 24 часа.Поскольку я собираю данные каждые 5 минут, я должен получить 144 строки в CSV через 24 часа.поэтому, если я использую readlines (), я могу сказать, сколько строк у меня есть, но как мне избавиться от любых строк, которые старше 24 часов?Это то, что я придумал, что, очевидно, не работает.Предложения?

f = open("24hr.csv","r")
lines = f.readlines()
f.close()

if lines => 144:
   f = open("24hr.csv","w")
   for line in lines:
       if line <= "timestamp"+","+"tempF"+\n":
           f.write(line)
           f.close()

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Если вы используете Linux или лайки, правильный подход - реализовать logrotaion

0 голосов
/ 14 декабря 2018

Вы используете Linux?Если вам нужны последние 144 строки, вы можете попробовать

tail -n 144 file.csv

U также может найти хвост для окон, я получил один с CMDer.Если вам нужно использовать python и у вас есть небольшой файл, который помещается в ОЗУ, загрузите его с readlines () в список, вырежьте его (lst = lst [: 144]) и перепишите.Если вы не уверены, сколько строк у вас есть - проанализируйте его с помощью https://docs.python.org/3.7/library/csv.html, проанализируйте время в python datetime (это похоже на исходное время записи) и запишите строки по условию

0 голосов
/ 14 декабря 2018

Учитывая, что 288 строк не будут занимать много памяти, я думаю, что это прекрасно, просто читая строки, обрезая файл и возвращая нужные строки:

# Unless you are working in a system with limited memory
# reading 288 lines isn't much
def remove_old_entries(file_):
    file_.seek(0)  # Just in case go to start
    lines = file_.readlines()[-288:]  # Read the last 288 lines
    file_.truncate(0)  # Empty the file
    file_.writelines(lines)  # Put back just the desired lines

    return _file

while True:
    tempC = mcp.temperature
    tempF = tempC * 9 / 5 + 32
    timestamp = datetime.datetime.now().strftime("%y-%m-%d %H:%M   ")

    with open("24hr.csv", "r+") as file_:
        file_ = remove_old_entries(file_)  # Consider that the function will return the file at the end
        file_.write('{},{}\n'.format(timestamp, tempF))

    # I hope mcp.temperature is blocking or you are sleeping out the 5min
    # else this file reading in an infinite loop will get out of hand
    # time.sleep(300)  # Call me maybe
0 голосов
/ 14 декабря 2018

Вы уже сделали большую часть работы.У меня есть пара предложений.

  1. Используйте with.Это будет означать, что если в середине вашей программы произошла ошибка и возникла исключительная ситуация, файл будет закрыт должным образом.
  2. Извлеките временную метку из файла и сравните ее с текущим временем.
  3. Используйте len для проверки длины list.

Вот исправленная программа:

import datetime

with open("24hr.csv","r") as f:
    lines = f.readlines()  # read out the contents of the file

if len(lines) => 144:
   yesterday = datetime.datetime.now() - datetime.timedelta(days=1)
   with open("24hr.csv","w") as f:
       for line in lines:
           line_time_string = line.split(",")[0]
           line_time = datetime.datetime.strptime(line_time_string, "%y-%m-%d %H:%M   ")

           if line_time > yesterday:  # if the line's time is after yesterday
               f.write(line)  # write it back into the file

Этот код не очень чистый (не соответствуетна ПКП-8), но вы видите общий процесс.

...