You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环读取文件逐行删除已读内容出现数据错乱如何解决?

代码存在的核心问题
  • 文件句柄与修改后内容不同步:你在Test函数中已经以只读模式打开了ReadingFile生成文件对象a_file,这个对象初始化时会加载文件的初始长度、缓冲区内容,你在循环中调用RemoveOneLine修改了源文件的内容和长度,但a_file的读取偏移量不会同步感知文件变化,仍会按照初始的偏移位置读取数据,导致读取到错位、截断的错误内容。
  • 删除逻辑存在缺陷:RemoveOneLine函数是按内容匹配删除所有符合的行,若文件内存在重复公钥会误删多行;同时用strip('\n')匹配,若行内存在首尾空白符会导致匹配失败,出现该行未被删除的问题。
  • 频繁全量读写易损坏文件:每处理一行就做一次全量读、全量写操作,文件较大时不仅性能极低,还可能出现读写时序冲突导致文件内容损坏。
正确实现方案

推荐两种实现思路,按需选择:

方案1:内存处理模式(适合文件不大的场景,性能最高)

一次性读取所有行到内存,逐行处理完成后清空文件,无需频繁修改源文件:

import logging

logger = logging.getLogger(__name__)  
logger.setLevel(logging.INFO)

file_handler = logging.FileHandler('Test.log')
file_formatter = logging.Formatter('[%(asctime)s]: %(message)s')
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)

def Test(filename):
    # 一次性读入所有行
    with open(filename, 'r', encoding='utf-8') as f:
        lines = [line.strip() for line in f if line.strip()]
    
    # 逐行处理
    for line in lines:
        logger.info('was [{}]'.format(line))
        # 这里可以加你自己的业务处理逻辑
    
    # 处理完成后清空文件
    with open(filename, 'w', encoding='utf-8') as f:
        f.write('')

Test('ReadingFile')

方案2:逐行修改源文件模式(适合必须实时删除已读行的场景)

每次处理都重新打开文件读第一行,处理完成后重写文件剩余内容,避免长持文件句柄导致的同步问题:

import logging
import time

logger = logging.getLogger(__name__)  
logger.setLevel(logging.INFO)

file_handler = logging.FileHandler('Test.log')
file_formatter = logging.Formatter('[%(asctime)s]: %(message)s')
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)

def process_one_line(filename):
    # 读取当前所有行
    with open(filename, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    if not lines:
        return False # 文件为空,结束循环
    
    # 处理第一行
    first_line = lines[0].strip()
    logger.info('was [{}]'.format(first_line))
    # 这里可以加你自己的业务处理逻辑
    
    # 重写剩余行到文件
    with open(filename, 'w', encoding='utf-8') as f:
        f.writelines(lines[1:])
    return True

def Test(filename):
    while True:
        has_data = process_one_line(filename)
        if not has_data:
            break
        # 按需加间隔时间,避免CPU占用过高
        # time.sleep(0.1)

Test('ReadingFile')

内容的提问来源于stack exchange,提问作者Irinel Iovan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:09:02