打开文本文件,仅在python中打印新行
我打开一个文本文件,它一旦创建,就会不断地被写入,然后将它打印到控制台上任何新行,因为我不想每次都重新打印整个文本文件。我正在检查文件是否变大,如果是,请打印下一行。这基本上是可行的,但有时它会对下一个新行感到有点困惑,新行出现在几行中,与旧行混合在一起。 有没有更好的方法,下面是我目前的代码打开文本文件,仅在python中打印新行,python,readlines,os.path,Python,Readlines,Os.path,我打开一个文本文件,它一旦创建,就会不断地被写入,然后将它打印到控制台上任何新行,因为我不想每次都重新打印整个文本文件。我正在检查文件是否变大,如果是,请打印下一行。这基本上是可行的,但有时它会对下一个新行感到有点困惑,新行出现在几行中,与旧行混合在一起。 有没有更好的方法,下面是我目前的代码 infile = "Null" while not os.path.exists(self.logPath): time.sleep(.1) if os.path.isfile(self.log
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()
另外,我的应用程序在等待创建文本文件时会冻结,因为它需要几秒钟的时间才能显示出来,这并不好
干杯。也许你可以:
每次需要读取文件时,请打开该文件,
使用lastSize作为参数,直接查找到上次阅读时停止的位置。
附加注释:我不知道您是否需要一些保护,但我认为您不应该费心测试给定的文件名是否是文件;只要打开它一试…除了阻止和捕捉问题,如果有的话
至于应用程序的冻结,您可能需要使用某种线程,例如:一个线程(您的主线程)正在处理GUI,另一个线程将等待创建文件。创建文件后,第二个线程向GUI线程发送信号,其中包含要显示的数据。解决方案可能会有所帮助。您还需要使用os.path.isfile和time.sleep等待文件出现。如果您在windows上,您可能只需要使用linux tail-f fname命令-use cygwin。相关: