我试图使用打开的日志文件实时绘制一些温度读数,每秒2个读数。它有效,但它一直在重新开始,我不知道为什么。例如,如果logData文件以20个85度读数开始,然后是50个84度读数,则该图应该看起来像两级楼梯。最后一步应该比第一步长2.5倍。但我得到的是一个太长的第一步,然后是非常短的第二步(只有它应该是的5%),然后它再次绘制第一个温度(这次是正确的长度),然后是第二个步骤,但是更长的时间(大约应该是它的20%)。它不断重复这种牙齿状图案,每个底部步骤越接近正确的长度。有什么建议吗?
import matplotlib.pyplot as plt
tempF=[]
plt.ion()
while True:
lines = open('putty.log').readlines()
open('logData.txt', 'w').writelines(lines[10:-1])#The 10:-1 is to remove junk from putty's opening lines in putty.log
with open('logData.txt') as fp:
for line in fp:
p=line.split(' ')
temp = float(p[1])
tempF.append(temp)
plt.plot(tempF, 'ro-')
plt.draw()
答案 0 :(得分:1)
你的文件根本没有错。你正在阅读并写错了。
所以这是交易。 with open
语句会一直重新打开您的文件并将其设置为开头。每次python在循环中执行其环形交叉路径时,它都会从头开始读取文件,即使它尚未更改,也会将值放入列表中。如果您只在一个行文件上测试此代码,您会看到它继续将相同的行添加到您的数组中,尽管它已经读过它。然后,您将整个列表绘制为与文件长度相同的次数。一旦你读完所有新行,就足以将列表绘制一次。
问题还在于,您继续阅读putty.log
中的所有行并将所有行写入logData.txt
,并将所有行从logData.txt
读取到列表中,但您永远不会重置列表。这看起来可能导致您的数据不断加倍。即
putty: 10
log: 10
templ.append(10) --> [10]
putty: 10, 10
log: 10, 10 #because you use the "w"
#but you forget to forget about old numbers in the templ
templ.append(10)
templ.append(10) ---> [10, 10, 10] #instead of [10, 10]
在这个主题上,使用w
选项既聪明又幸运。 w
将覆盖文件中的所有先前条目,并完全写入新文件。这可以保证您至少不会在logData
文件中将结果加倍。
Python也可能与putty冲突对文件的权限,此时putty可能被拒绝访问并且你的脚本继续读取相同的值,如果它不是你可能运气好因为你有一个命令一行所以它相对较快,关闭文件并且到目前为止还没有失败。
因此,解决方案可能是您每次从顶部开始都会忘记所有数据,并将所有数据读取到一个新的列表中。这可以防止数据加倍。一旦有了readlines,你也不需要将putty.log
保存到不同的文件中,你可以使用它们。
使用带有try-catch块的新while
,该块将询问打开文件是否失败,并将继续尝试直到打开文件,快速将读取行保存到列表中,然后再次关闭文件。
要等待使用time
内置模块和time.sleep(n_seconds)
。我建议等待更长的时间(超过0.5秒,~3-5秒),以确保matplotlib不会崩溃,这可以在没有任何分辨率损失的情况下完成,因为putty.log
会记住所有值(减去可能是你执行readlines
时他没有设法写的那些)。