Python根据日期从CSV中删除行

时间:2018-12-14 17:38:15

标签: python timestamp readlines

我正在使用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分钟采样一次数据,因此24小时后我应该在CSV中以144行结尾。因此,如果我使用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 :(得分:0)

您已经完成了大部分工作。我有一些建议。

  1. 使用force。这意味着如果程序中途出现错误并且引发了异常,则文件将被正确关闭。
  2. 从文件中解析时间戳,并将其与当前时间进行比较。
  3. 使用with检查len的长度。

这是修改后的程序:

list

此代码不是很干净(不符合PEP-8),但是您会看到一般过程。

答案 1 :(得分:0)

您使用linux吗?如果您需要最后144行,可以尝试

tail -n 144 file.csv

您也可以在窗户上找到尾巴,我用CMDer弄到了。 如果您必须使用python并且您有适合RAM的小文件,请使用readlines()将其加载到列表中,将其剪切(lst = lst [:144])并重写。如果您不知道自己有多少行,请使用https://docs.python.org/3.7/library/csv.html进行解析,然后将时间解析为python datetime(类似于u原始写入时间),然后按条件写入行

答案 2 :(得分:0)

鉴于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

答案 3 :(得分:0)

如果您使用的是Linux或类似操作系统,正确的方法是实施logrotaion