实时读写场景下,如何向文件指定位置及末尾交替写入内容?
实现方案
核心原则
必须以追加或定位写入的方式操作文件,绝对不能覆盖或重建文件,确保其他实时读取该文件的软件能持续获取完整数据。
具体操作步骤
1. 给[SampleTimes]段追加采样时间
- 先定位段尾:
- 以只读模式打开文件,扫描所有行,找到
[SampleTimes]的起始行,再往下找到下一个段头(以[开头的行)的前一行,这个位置就是采样段的末尾;如果文件还没有其他段,段尾就是文件最后一行 - 关闭只读模式,再以读写模式打开文件,把文件指针移到刚才确定的段尾位置,直接写入新的采样时间条目(比如
2559=0.063975)
- 以只读模式打开文件,扫描所有行,找到
2. 给[Comments]段追加注释
- 首次添加注释:
- 以只读模式打开文件,读取末尾约100字节内容,判断是否存在
[Comments]段 - 如果没有,先在文件末尾写入换行符+
[Comments]+换行符,再写入第一条注释 - 如果已有该段,直接把文件指针移到文件末尾,追加新的注释条目(比如
12.34567,0,0,65536,new comment)
- 以只读模式打开文件,读取末尾约100字节内容,判断是否存在
代码示例(Python)
import os def append_sample_time(file_path, sample_key, sample_value): # 定位SampleTimes段的末尾位置 with open(file_path, 'r') as f: lines = f.readlines() sample_start_idx = None sample_end_idx = len(lines) for i, line in enumerate(lines): stripped_line = line.strip() if stripped_line == '[SampleTimes]': sample_start_idx = i elif sample_start_idx is not None and stripped_line.startswith('['): sample_end_idx = i break # 追加新采样时间 with open(file_path, 'r+') as f: f.seek(sum(len(line) for line in lines[:sample_end_idx])) f.write(f"{sample_key}={sample_value}\n") def append_comment(file_path, comment_line): # 检查文件是否已有Comments段 has_comments = False file_size = os.path.getsize(file_path) with open(file_path, 'r') as f: f.seek(max(0, file_size - 100)) tail_content = f.read() if '[Comments]' in tail_content: has_comments = True # 写入注释内容 with open(file_path, 'a') as f: if not has_comments: f.write("\n[Comments]\n") f.write(f"{comment_line}\n") # 调用示例 append_sample_time("data.ini", "2559", "0.063975") append_comment("data.ini", "12.34567,0,0,65536,new comment")
关键注意事项
- 文件操作必须用非独占模式,保证其他软件能同时读取
- 定位采样段时,要考虑文件已经添加了注释段的情况,避免把采样时间写到注释区
- 追加注释时,仅首次添加需要检查段头,后续直接追加即可,减少不必要的文件扫描
内容的提问来源于stack exchange,提问作者Been Moo
相关产品推荐
相关产品推荐

