写入“while”-loop里面的.csv文件

时间:2015-04-29 16:47:46

标签: python loops csv while-loop

使用

result = open("data/"+ name + "_" + timestamp + ".csv", "w")
result.write("time; data1; data2; data3 \n")`

我打开一个文件并用列标识符填充它。

使用

while True:
    timestamp = time.strftime("%H:%M:%S", time.localtime())
    data1,data2,data3 = device.fetchData()

    result.write(timestamp +";"+ str(data1) +";"+ str(data1) +";"+ str(data3) +"\n")
    time.sleep(seconds)
<。> .csv文件应填充测量数据。现在的问题是,如果我在退出脚本后检查文件,它是完全为空,甚至列标识符都不存在。 但是,如果我使用for循环,它就会像它应该的那样工作。

我的理解很奇怪。

2 个答案:

答案 0 :(得分:1)

我假设你想让这个程序无限期地运行以从某种传感器收集数据,所以我怀疑这个问题是你open()调用的默认缓冲。

首先,您应该几乎总是使用像@Spirine建议的“with”块,但在您的情况下,需要稍作修改:

with open("data/"+ name + "_" + timestamp + ".csv", "w", 1) as result:

最后的, 1表示行缓冲,这意味着Python会在每行末尾将文件写入磁盘。另外,考虑使用str.format()使其更加精致:

log_line_template = "{ts:%H:%M:%S};{d1};{d2};{d3}\n"
filename = "data/{n}_{ts:%H_%M_%S}.csv".format(n=name, ts=datetime.now())

with open(filename, "w", 1) as result:
    result.write("time; data1; data2; data3 \n")`

    while True:
        data1,data2,data3 = device.fetchData()
        result.write(log_line_template.format(
            ts=datetime.now(), data1, data2, data3
        ))
        time.sleep(seconds)

答案 1 :(得分:0)

如果你的文件没有正确写入,因为你的程序被错误地停止了:为了逃避while循环,你做了什么? 如果您不想过多修改代码,可以使用postNotificationName上下文管理器:

open

因为它,无论发生什么,您的文件将在程序结束时正确关闭。