[英]Writing a CSV file in Python with root.after gives an Error
我在Raspberry Pi上編程了一個數據記錄器(用Python 3.5.3編程),在這里我將從ADC輸入的數據寫入CSV文件。 我也有一個GUI(用tkinter制作),我想在其中控制測量的開始和結束。 我通過使用按鈕調用以下功能開始測量:
def do_start():
spi.open(0,0)
ch0 = [0x0c,0x00,0x00]
a = adc(ch0)
b = a[1]
b = b&0b00001111
c = a[2]
value = c+256*b
voltage = value/4096*5
zeit = millis()
voltage = round(voltage,2)
data=[voltage,zeit]
with open(csvfilesave,"a") as output:
writer = csv.writer(output, delimiter=",",lineterminator = '\n')
writer.writerow(data)
root.after(100, do_start)
這對於前2048個重復工作正常,但是在此之后,我得到以下錯誤:
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.5/tkinter/__init__.py", line 1562, in __call__
File "/usr/lib/python3.5/tkinter/__init__.py", line 608, in callit
File "/home/pi/Documents/loggerprojekt/gui.py", line 34, in do_start
OSError: [Errno 24] Too many open files
在無休止的循環中將數據寫入CSV文件時,我沒有收到此錯誤,但是后來我無法訪問GUI來停止它。 有沒有辦法我可以避免使用tkinter出現此錯誤?
無法復制代碼,但是我的猜測是錯誤消息中的“文件”不是csv文件,而是在do_start
第一行中打開的類似文件的對象。 您執行spi.open(0,0)
,但從未在spi
上調用close
。
我相信會發生的事情是,即使在打開段打開后自動調用了output.close()方法,還是由操作系統來緩沖I / O調用,並且無法像打開循環一樣快地關閉文件。 這意味着即使在output.close()之后,OS仍保留文件的時間更長。 有討論類似的問題在這里 。
但是,這很難測試和驗證。 一種方法是調用sleep函數,以使OS有時間進行清理,但這會大大降低程序速度。 另外禁用打開緩沖(csvfilesave,“ a”,緩沖= 0)可能會有所幫助。 緩慢的I / O更有可能在RPi和相當平台依賴上引起問題。
無論如何,解決您的問題的一個簡單方法就是只打開一次文件。 下面是一個示例(我也刪除了遞歸,因為遞歸,因為它會導致大的迭代問題):
import csv
def do_start():
with open(r"c:\temp\foobar.txt", "a") as output:
for i in range(3000): # replace this with custom looping logic
append_to_file(output)
def append_to_file(open_file):
writer = csv.writer(open_file, delimiter=",", lineterminator='\n')
data = "My hovercraft", "full of eels" # replace data with your voltage, zeit
writer.writerow(data)
do_start()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.