Python 一段时间后未能持续保存和更新.CSV文件

Python 一段时间后未能持续保存和更新.CSV文件,python,csv,collections,export-to-csv,Python,Csv,Collections,Export To Csv,我写了一个小程序,每分钟从两台设备上读取数值,然后保存到一个.csv文件中。我希望在每次收集每个点后更新并保存该文件,以便在pc崩溃或出现其他问题时不会发生数据丢失。为此,我打开文件(ab模式),使用write行并在循环中关闭文件。两次采集之间的时间约为1分钟。这工作得很好,但问题是在5-6小时的数据收集后,它停止保存到.csv文件,并且不会出现任何错误,代码继续运行,图形正在更新,就像什么都没有发生一样,但打开.csv文件会显示数据丢失。我想知道我使用的代码是否有问题。我也不应该,我正在运行一

我写了一个小程序,每分钟从两台设备上读取数值,然后保存到一个.csv文件中。我希望在每次收集每个点后更新并保存该文件,以便在pc崩溃或出现其他问题时不会发生数据丢失。为此,我打开文件(ab模式),使用write行并在循环中关闭文件。两次采集之间的时间约为1分钟。这工作得很好,但问题是在5-6小时的数据收集后,它停止保存到.csv文件,并且不会出现任何错误,代码继续运行,图形正在更新,就像什么都没有发生一样,但打开.csv文件会显示数据丢失。我想知道我使用的代码是否有问题。我也不应该,我正在运行一个子进程,从这个实时打印,但我不认为这会导致一个问题。。。我还添加了这些代码行

##Initial file declaration and header
with open(filename,'wb') as wdata:
     savefile=csv.writer(wdata,dialect='excel')
     savefile.writerow(['System time','Time from Start(s)','Weight(g)','uS/cm','uS','Measured degC','%/C','Ideal degC','/cm'])

##Open Plotting Subprocess
 draw=subprocess.Popen('TriPlot.py',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
##data collection loop
while True:
   Collect Data x and y
   Waits for data about 60 seconds, no sleep or pause commoand used, pyserial inteface is used.
   ## Send Data to subprocess 
   draw.stdin.write('%d\n' % tnow)
   draw.stdin.write('%d\n' % s_w)
   draw.stdin.write('%d\n' % tnow)
   draw.stdin.write('%d\n' % float(s_c[5]))

   ##Saving data Section 
   wdata=open(filename,'ab')
   savefile=csv.writer(wdata,dialect='excel')
   savefile.writerow([tcurrent,tnow,s_w,s_c[5],s_c[7],s_c[9],s_c[11],s_c[13],s_c[15]])
   wdata.close()
注:此代码使用以下未显示的代码包。pyserial、csv、os、subprocess、Tkinter、string、numpy、time和wx

如果
draw.stdin.write()
阻塞,则可能意味着您没有及时使用
draw.stdout
。文档警告由于操作系统管道缓冲区已满而导致死锁


如果不需要输出,可以将
stdout=devnull
where
devnull=open(os.devnull,'wb')
设置为,否则有几种方法可以在不阻塞代码的情况下读取输出:threads,select,
tempfile.TemoraryFile

可以打开文件名一次,只需调用
wdata.flush()
在循环结束时(您可以添加
os.fsync(wdata)
在极少数情况下可能会有所帮助),如果您只需将虚拟数据写入1000次,您是否可以复制它?J.F我将尝试重新写入一个长数据文件。对于.flush(),我将把wdata=open和savefile=csv.writer移出循环,只需在循环中调用savefile.writerow()和wdata.flush()?是的,
.writerow()。flush()
您考虑过使用该库吗?这比你自己滚要容易。