我正在打开一个文本文件,一旦创建就会不断被写入,然后将其打印到控制台的任何新行,因为我不想每次都重新打印整个文本文件。我正在检查文件是否增大,如果是,只需打印下一个新行。这大部分都在工作,但偶尔会对下一个新线路感到有些困惑,新线路会出现几行,与旧线路混合在一起。 有没有更好的方法,下面是我目前的代码。
infile = "Null"
while not os.path.exists(self.logPath):
time.sleep(.1)
if os.path.isfile(self.logPath):
infile = codecs.open(self.logPath, encoding='utf8')
else:
raise ValueError("%s isn't a file!" % file_path)
lastSize = 0
lastLineIndex = 0
while True:
wx.Yield()
fileSize = os.path.getsize(self.logPath)
if fileSize > lastSize:
lines = infile.readlines()
newLines = 0
for line in lines[lastLineIndex:]:
newLines += 1
self.running_log.WriteText(line)
lastLineIndex += newLines
if "DBG-X: Returning 1" in line:
self.subject = "FAILED! - "
self.sendEmail(self)
break
if "DBG-X: Returning 0" in line:
self.subject = "PASSED! - "
self.sendEmail(self)
break
fileSize1 = fileSize
infile.flush()
infile.seek(0)
infile.close()
此外,我的应用程序在等待创建文本文件时冻结,因为它需要几秒钟才能显示,这不是很好。
干杯。
答案 0 :(得分:0)
也许你可以:
lastSize
作为seek
的参数直接用于您上次阅读时停止的位置。补充评论:我不知道你是否需要一些保护,但我认为你不应该费心去测试给定的文件名是否是文件;只需在try...except
块中打开它,就可以发现问题。
至于冻结你的应用程序,你可能想要使用某种线程,例如:一个线程,你的主线程正在处理GUI,第二个线程将等待创建文件。创建文件后,第二个线程将信号发送到GUI线程,其中包含要显示的数据。
答案 1 :(得分:0)
This解决方案可以提供帮助。您还必须等待文件显示,使用os.path.isfile
和time.sleep
。