Python文件写入不完整问题排查:多脚本并发是否为诱因?
文件写入不完整问题排查与解决
一、多脚本并行写入是首要嫌疑
- 你用了
'a'追加模式打开文件,如果两个脚本同时操作同一个文件路径,操作系统的文件并发写入会引发冲突:两个进程的写缓冲区可能互相覆盖,或者某进程的写操作还未完成就被另一个进程打断,最终导致部分内容丢失。 - 解决办法:
- 确保两个脚本生成的文件路径不同(比如给文件名加唯一标识,如进程ID、时间戳);
- 给文件加排他锁:Linux用
fcntl,Windows用msvcrt,保证同一时间只有一个进程能写入文件; - 改成串行执行,避免同时操作同一文件。
二、缓冲区未及时刷新
Python文件对象默认使用块缓冲,即使在with块内,缓冲区内容会攒到一定大小才写入磁盘。如果脚本异常终止(比如被系统资源限制打断、进程意外退出),缓冲区里的内容就会丢失,哪怕with块没走完。
- 解决办法:
- 打开文件时启用行缓冲:
这样每写完一行就自动刷新缓冲区到磁盘。with open(IPATH+'\\'+ IP+'_XDSL_RECFG', 'a', buffering=1 )as OUT: - 手动调用刷新:每次
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
相关产品推荐
相关产品推荐

