CSV,在每次运行/度量之间保持文件打开

时间:2015-06-03 06:36:25

标签: python csv writing

我有关于编写CSV文件的问题。我有一个工具,我每分钟都会读取一个值,并将值与时间戳一起写入CSV文件。

我编写了一个有效的简单代码,这是下面的第一个代码。但是我的朋友提出了一个问题:“为什么要为每次运行打开和关闭文件。”我无法回答他的问题,因为我是编程和Python的新手。不过,我试图重写代码,所以它变成了下面的解决方案2,然后问我的朋友 这是否更好,但他无法回答我。所以我希望你能帮助我,#1和#2之间的区别是什么,两者在后来阅读文件时都给出了相同的结果。

#1是否会在while循环中为每次运行打开和关闭文件,而#2会保持文件打开并在上次运行后关闭它?

这只是一个简单的例子,实际上,我将扩展代码,以便每分钟进行一次测量,运行3-4天,我将记录多个电压和多达8个温度。因此,最终,文件可能变得非常大并且打开和关闭文件 可能会消耗一点资源。

  

代码#1:

import csv
import datetime
import time

no_meas = 5 #number of measurements
cur_meas = 1    # current measurement number


while cur_meas <= no_meas:
    cur_time = datetime.datetime.strftime(datetime.datetime.now(), '%H:%M:%S')
    with open('test.csv', 'a', newline='') as fp:
        a = csv.writer(fp, delimiter=',')
        data = [[cur_time, 'test-text']]
        a.writerows(data)
    cur_meas += 1
    time.sleep(60)
  

代码#2

import csv
import datetime
import time

no_meas = 5 #number of measurements
cur_meas = 1    # current measurement number

with open('test.csv', 'a', newline='') as fp:
    while cur_meas <= no_of_meas:
        cur_time = datetime.datetime.strftime(datetime.datetime.now(), '%H:%M:%S')
        a = csv.writer(fp, delimiter=csv_delimiter)
        data = [[cur_time, 'test-text']]
        a.writerows(data)
        cur_meas += 1
        time.sleep(60)

1 个答案:

答案 0 :(得分:0)

如果写入文件的频率很高,您可能希望避免打开/关闭开销。然而,根据您的描述,它似乎不是一个问题(每分钟打开/关闭一次,用于编写几十个测量值)。即使几天后,您的文件也不应超过1-3MB大小。

由于您计划让它运行几天,您应该处理失败的情况而不会丢失收集的数据。在第一种情况下,您不会丢失任何数据。在第二种情况下,我建议在每次写入后添加一个flush,以确保将数据写入磁盘:

a.writerows(data)
fp.flush()
os.fsync(fp.fileno())