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
相关产品推荐
相关产品推荐

