python 读取更新中的log 或其他文本

本文分享了一种通过Server-SendEvent将实时更新的日志文件发送至前端的技术方案。利用Python脚本,通过记录文件读取位置的方式,实现了只读取新增日志的功能,避免了重复读取已发送内容的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中遇到这个问题,想把本地的log文件通过 Server-Send Event 的形式 发送给前端。

但是如何把那些  新增加log文本 读取出来就成了问题。

想过遍历log文件取得行数,读取最后几行文件,这种方式,不过缺点也很明显,log 文件很有可能会重复。因此在网上看了些介绍,也查了些资料,整理了如下代码。

 

start_point=0
def read_logs():
    fo = open("heakth_info.log", "rb") # 一定要用'rb'因为seek 是以bytes来计算的
    print ("文件名为: ", fo.name)
    global start_point  #使用全局变量,让start_point 时刻保持在已经输出过的那个字节位
    fo.seek(start_point, 1)#移动文件读取指针到指定位置 
    for line in fo.readlines():
        print ("读取的数据为:" + str(line.decode()))
    #输出后的指针位置赋值给start_piont
    start_point=fo.tell()
    fo.close()

在这里fo = open("heakth_info.log", "rb") 一定要用rb 因为seek是以字节算的。

使用全局变量 让start_point 在运行过后始终保持在最后输出完成的位置。成为下次运行的起点。

fo.tell() 返回的是文件当前的位置,在运行结尾赋值给 start_point

 

这样只要定时呼出这个 函数 就能获得最新的 log 了。

<think>我们有两个问题: 1. 如何用Python读取文本文件的一? 2. 为什么readline返回一个字符? 首先,第一个问题:如何读取? 我们可以使用文件对象的readline()方法,者更常用的,使用for循环逐迭代。 第二个问题:为什么readline返回一个字符? 这通常是因为文件是以二进制模式打开,者文件已经被读取到了末尾(返回空字符串),者可能你错误地使用了read(1)(读取一个字符)而不是readline()。 但是,如果文件以文本模式打开,readline()会返回一(包括换符),除非到达文件末尾(返回空字符串)。 让我们先给出读取文件一的几种方法。 方法1:使用readline() 方法2:使用for循环 方法3:使用readlines(),但注意它会读取所有,可能不适合大文件。 示例代码:</think>### Python读取文本文件一的方法及`readline`为解析 #### 1. 如何读取文本文件的一Python提供了三种常用方法读取文件的单内容: ```python # 方法1:使用readline()逐读取 with open('log.txt', 'r') as file: line1 = file.readline() # 读取第一 line2 = file.readline() # 读取第二 # 方法2:使用for循环迭代(内存高效) with open('log.txt', 'r') as file: for line in file: print(line) # 每次迭代处理一 # 方法3:使用readlines()[index](小文件适用) with open('log.txt', 'r') as file: lines = file.readlines() first_line = lines[0] # 获取第一 ``` #### 2. 为什么`readline()`有时返回单个字符? 当`readline()`返回单个字符时,通常由以下原因导致: 1. **文件指针位置错误**:前序读取操作改变了指针位置 2. **文件末尾**:读取到文件结尾时返回空字符串`''` 3. **异常文件格式**:文件包含超长二进制数据 4. **模式错误**:以二进制模式(`'rb'`)打开文件 #### 验证示例代码 ```python def diagnose_readline_issue(filename): with open(filename, 'r') as file: # 检查首字符 first_char = file.read(1) print(f"首字符: {repr(first_char)}") # 重置指针并读取 file.seek(0) full_line = file.readline().rstrip('\n') print(f"完整: {repr(full_line)}") # 检查文件指针位置 print(f"指针位置: {file.tell()}/{file.seek(0, 2)} bytes") # 使用示例 diagnose_readline_issue('log.txt') ``` #### 关键注意事项: 1. **换符包含**:`readline()`返回包含`\n`的完整(文件末尾除外) 2. **指针管理**:每次`readline()`会使指针移动到下一起始位置 3. **空处理**:空返回`'\n'`,文件末尾返回`''` 4. **大文件优化**:使用迭代器模式避免`readlines()`的内存问题 #### 推荐解决方案: ```python # 安全读取方案(带异常处理) try: with open('log.txt', 'r') as file: while True: line = file.readline() if not line: # 文件结束 break if len(line) == 1 and line != '\n': print(f"警告:单字符: {repr(line)}") # 正常处理数据 process(line.rstrip('\n')) except FileNotFoundError: print("错误:文件不存在") except UnicodeDecodeError: print("错误:文件编码问题") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值