簡體   English   中英

使用root.after在Python中編寫CSV文件會出現錯誤

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM