Python读文件出现匹配失败,内容缺失问题

发布于 1 个月前

python读取文件,采用循环输出行,行缺失问题

问题描述

写了一个自动化截取日志进行记录的python脚本,但在测试过程中发现后面有内容没有显示出来,于是截图内容有错误。

问题排查

  1. 排查读文件:因为直接打印读取文件内容,感觉有缺失部分,查资料说的可能是文件编码问题什么的,于是做了个try...catch尝试以utf-8和gbk方式读取,没有效果后又采用了二进制读取文件,貌似终于完整了,但后续打印line,发现内容还是识别不到。

  2. 查看是否是匹配问题,修改了几版,发现怎么都达不到效果,但理论上应该是匹配得到的。

  3. 上面两步调试后,初步判定还是文件读取内容不全,导致的匹配不到对应部分。

  4. 通过调试发现,使用repr(line)输出段可发现文件是完整的,但直接打印line则并不完整,于是在这里又尝试了很多办法SOS,因为有格式要求,不能直接打印repr(line),且处理repr(line)又会出现内容丢失。

  5. 通过打印行号,发现会出现行缺失(行跳跃)问题,尝试了各种办法,没搞明白为什么....

问题解决

但了解到可能是缓冲问题,于是尝试创建缓冲区或者刷新缓冲区解决:

1.强制刷新输出

sys.stdout.flush()  # 强制刷新缓冲区

2.改为无缓冲输出

添加flush参数

print(line,end='',flush=True)

以上两种方式并没有效果,在显示日志记录那里依然显示出行缺失问题。

...整无语了...啊啊啊啊啊啊啊啊

转机出现在下午要下班的时候(可能要下班了人就是要灵活一些)

因为发现缺失部分总是在查看了日志记录后出现(而日志真的很多),突然想到会不会根本不是读取文件这些的原因(当然排查下来也不是了),而是读取速度太快,但终端打印速度跟不上内容显示的速度导致的?

好家伙,直接尝试,在读到日志那部分时进行一定控制:大致就是读100条会等待1s,发现后续需要部分真匹配显示出来了...

于是GPT了一下,发现确实有终端缓存这个说法,当文件内容过大时,就可能会出现这种情况——终端显示速度跟不上打印内容速度导致的行缺失,大致了解一下,处理办法大概有:

  1. 将文件分段读取(可行,后续发现可能还是会有部分缺失)
  2. 设立缓存区(本次没有生效)
  3. 在对应地方适当暂停,给终端缓存(反应)时间(本次采用,因为感觉最稳定)

于是在后续需要匹配的地方(当匹配成功时)都添加了一句:time.sleep(2)。发现可以匹配到对应部分并成功打印后续内容并截图了。

总结

当文件内容貌似缺失,导致匹配失败的问题。可能不是缺失的问题而是没有显示的问题,即是终端的问题。

本次处理很无语,因为第一次了解到终端缓存导致缺失的问题。也算一次经历。

后续梳理了一下,感觉最好的处理是分段读文件 + 适当的停顿。

因为单独使用或许还是会导致关键部分丢失从而出现匹配出错。

Terminal
MobaXterm
Python
$ cd ..