2015-04-29 49 views
0

通過使用寫入內部.csv的文件「而」 -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循環,它應該像它應該那樣工作。

我的理解很奇怪。

+0

您是否在最後關閉了文件對象? 'result.close()' – ODiogoSilva

+0

你沒有用'for'循環顯示版本,所以很難猜測。此外,還不清楚「fetchData」的作用。嘗試創建一個顯示問題的最小示例,而不依賴於項目的其他部分。 – BartoszKP

回答

0

如果你的文件寫得不正確,那是因爲你的程序被錯誤地停止了:爲了避免while循環,你做了什麼? 如果你不想太多修改您的代碼,你可以只使用open情況管理器:

with open("data/"+ name + "_" + timestamp + ".csv", "w") as result: 
    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) 

因爲它,不管發生什麼事,你的文件將被正確地在程序結束時關閉。

1

我假設你想讓這個程序無限期地運行以收集來自某種傳感器的數據,所以我懷疑這個問題是你的open()調用的默認緩衝。

首先,你應該總是使用「與」像@Spirine塊提示,但在你的情況下,輕微的修改是爲了:

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) 
+0

好的,這聽起來很好,直到我試過它和:與以前相同的結果:(文件是空的 我沒有使用格式化的東西,因爲我還不明白,但這不應該阻止它 我在eclipse環境中運行腳本,並用停止按鈕停止腳本 – Creatronik

+0

一位同事給了我解決方法: – Creatronik

+0

一位同事給了我解決方案: 在循環內部必須有一個result.flush()把數據寫到磁盤上 你能解釋一下,爲什麼「,1」沒有效果? – Creatronik