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

Python文件写入不完整问题排查:多脚本并发是否为诱因?

文件写入不完整问题排查与解决

一、多脚本并行写入是首要嫌疑

  • 你用了'a'追加模式打开文件,如果两个脚本同时操作同一个文件路径,操作系统的文件并发写入会引发冲突:两个进程的写缓冲区可能互相覆盖,或者某进程的写操作还未完成就被另一个进程打断,最终导致部分内容丢失。
  • 解决办法:
    • 确保两个脚本生成的文件路径不同(比如给文件名加唯一标识,如进程ID、时间戳);
    • 给文件加排他锁:Linux用fcntl,Windows用msvcrt,保证同一时间只有一个进程能写入文件;
    • 改成串行执行,避免同时操作同一文件。

二、缓冲区未及时刷新

Python文件对象默认使用块缓冲,即使在with块内,缓冲区内容会攒到一定大小才写入磁盘。如果脚本异常终止(比如被系统资源限制打断、进程意外退出),缓冲区里的内容就会丢失,哪怕with块没走完。

  • 解决办法:
    1. 打开文件时启用行缓冲:
      with open(IPATH+'\\'+ IP+'_XDSL_RECFG', 'a', buffering=1 )as OUT:
      
      这样每写完一行就自动刷新缓冲区到磁盘。
    2. 手动调用刷新:每次OUT.write()后加OUT.flush(),强制把缓冲区内容写入磁盘。

三、代码逻辑的潜在问题

你的代码里判断空值的方式可能有问题,导致逻辑分支错误,进而漏写内容:

  • 当前用row[1]=='NaN'判断空值,但pandas中真正的空值是np.nan或pd.NA,字符串"NaN"只是普通文本。如果数据里的空值是pandas原生空值,这个判断会失效,导致逻辑走错误分支(比如本该设置SERVICE_PROFILE=12,却走到else转int,可能引发隐性错误)。
  • 修正空值判断:
    import pandas as pd
    
    # 替换所有row[x]=='NaN'的判断为pd.isna()
    if pd.isna(row[1]) or row[1] == 15:
        SERVICE_PROFILE=12
    else:
        SERVICE_PROFILE=int(row[1])
    
    if not row[2] ==5 or pd.isna(row[2]):
        SPECTRUM_PROFILE=4
    else:
        SPECTRUM_PROFILE=5
    
    if pd.isna(row[5]):
        OUTTER_VLAN=480
        INNER_VLAN=PVID[i]
    # 其他空值判断同理修改
    

四、额外排查点

  • 检查脚本是否被意外终止:比如系统内存不足、被其他进程杀死,导致with块还没执行到最后一行OUT.write('## XDSL Reconfigure Done ##\n')就退出;
  • 给关键步骤加日志:比如在循环内打印当前处理的i和index,最后打印文件写入完成的日志,确认脚本是否完整执行。

内容的提问来源于stack exchange,提问作者Nader Ahmed Saeid Khater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:52:18