[英]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.