Python自动字符串合并问题:new.dat与old.dat合并异常求助
解决new.dat合并至old.dat的脚本异常问题
需求说明
- 将new.dat中的内容合并至old.dat,覆盖后的old.dat需满足指定的预期格式
- 当系统中出现new.dat的新内容时,需要持续执行合并流程
现有文件内容
new.dat
WBGG 120200Z VRB03KT 9000 FEW015 BKN160 28/25 Q1013 NOSIG
old.dat
WBGG 120130Z VRB02KT 9000 FEW015 BKN150 27/25 Q1013 NOSIG WBGG 120100Z VRB02KT 9999 FEW014 BKN150 26/25 Q1012 NOSIG
预期输出的old.dat内容
WBGG 120200Z VRB03KT 9000 FEW015 BKN160 28/25 Q1013 NOSIG WBGG 120130Z VRB02KT 9000 FEW015 BKN150 27/25 Q1013 NOSIG WBGG 120100Z VRB02KT 9999 FEW014 BKN150 26/25 Q1012 NOSIG
异常脚本
new=open("new.dat","r") old=open("old.dat","r") for line1 in new: data1=line1 for line2 in old: data2=line2 newdata=np.array([data1,data2]) ## overwrite file and become old file newfile = open("old.dat", 'w') newfile.write(newdata) newfile.close()
问题分析与解决思路
先给你拆解下原脚本踩的几个坑:
- 循环逻辑完全错误:两个for循环最后只会保留new.dat的最后一行和old.dat的最后一行——每次循环都会覆盖
data1和data2,根本没把所有内容收集全。 - 误用numpy数组:numpy数组是用来做数值计算的,不是拼接文本行的工具,直接把数组写入文件会导致格式彻底混乱。
- 文件处理不规范:打开的new和old文件没有关闭,容易造成资源泄漏;而且没有用更安全的
with上下文管理器。 - 没实现持续监听:原脚本只是单次执行,完全没处理“持续合并新内容”的需求。
修正后的实现方案
基础单次合并脚本
先搞定核心的合并逻辑,把new.dat的内容放到old.dat最前面,再覆盖原文件:
# 用with语句自动管理文件,避免资源泄漏 with open("new.dat", "r") as new_file: new_content = new_file.read().strip() # 去掉首尾多余空白 with open("old.dat", "r") as old_file: old_content = old_file.read().strip() # 合并内容:new在前,old在后,空文件情况也兼容 combined_content = f"{new_content}\n{old_content}" if old_content else new_content # 写入覆盖old.dat with open("old.dat", "w") as old_file: old_file.write(combined_content)
持续监听new.dat变化的版本
如果需要实时检测new.dat的更新并自动合并,可以通过监听文件修改时间实现:
import time from pathlib import Path new_path = Path("new.dat") old_path = Path("old.dat") # 记录初始修改时间 last_modified = new_path.stat().st_mtime print("开始监听new.dat的变化...") while True: current_modified = new_path.stat().st_mtime # 检测到文件有修改时执行合并 if current_modified > last_modified: with open(new_path, "r") as new_file: new_content = new_file.read().strip() with open(old_path, "r") as old_file: old_content = old_file.read().strip() combined_content = f"{new_content}\n{old_content}" if old_content else new_content with open(old_path, "w") as old_file: old_file.write(combined_content) print("已完成最新内容合并!") last_modified = current_modified # 每隔1秒检查一次,可根据需求调整间隔 time.sleep(1)
额外注意事项
- 避免重复合并:如果new.dat会重复写入相同内容,可以在合并前判断new的行是否已经存在于old中,防止冗余。
- 异常处理:实际使用时建议加上
try-except块,处理文件不存在、权限不足等异常情况。 - 换行符兼容:不同系统的换行符可能不同,可根据需要用
os.linesep替代\n来适配。
内容的提问来源于stack exchange,提问作者Azam




