已定义函数时如何将变量数据写入文件?排查写入不全问题
代码问题排查与修正
嘿,我看了你的代码,发现几个关键问题导致你只能写入少量内容甚至是空内容,咱们一个个拆解:
return语句过早终止函数执行:你在第一个
if '| SUCCESS |' in line分支里连续写了三个return,这会导致函数刚进入这个分支就直接返回MARKER,后面所有收集NewStr、组装OutStr的逻辑根本没机会执行。而且你还重复写了一次'| SUCCESS |'的判断分支,完全是逻辑冗余,还把正常流程搞乱了。局部变量无法被全局代码访问:你在
ChkCon()函数内部定义了OutStr,但它是函数的局部变量,外部代码根本拿不到它的值。更关键的是,你现在的代码是先执行文件写入操作,再调用函数——这时候OutStr还没被函数逻辑赋值,写入的自然是无效内容。状态切换逻辑混乱:Flag和FlagTcp的状态切换顺序有问题,多余的判断分支打断了正常的日志遍历流程,导致很多符合条件的内容没被收集到。
下面是修正后的代码,我调整了逻辑顺序,修复了return的问题,让函数返回组装好的内容后再处理文件写入:
fileData = 'ldap_conn_logs' def ChkCon(): Flag = False FlagTcp = False NewStr = '' HOST = '' MARKER = '----------------' NEWLINE = '\n' with open('ldap_bind_netstat', 'r') as log: for line in log: # 处理成功连接的情况,切换状态并记录主机地址 if '| SUCCESS |' in line: Flag = False FlagTcp = True HOST = line.split()[0] NewStr = '' # 处理失败/不可达的情况,关闭TCP内容收集状态 elif 'FAILED' in line or 'UNREACHABLE' in line: FlagTcp = False # 处于收集状态时,收集符合条件的TCP行 if FlagTcp and line.startswith('tcp'): NewStr += line if 'tsdj-lb-oidc01' not in line: Flag = True # 遍历完日志后组装结果字符串 OutStr = HOST + NEWLINE + MARKER + NEWLINE + NewStr return OutStr # 先调用函数获取要写入的内容,再执行写入操作 result = ChkCon() with open(fileData, mode='a', encoding='utf-8') as fileWrite: fileWrite.write(result)
修正的核心点:
- 移除了多余的判断分支,让循环能完整遍历整个日志文件
- 函数返回组装好的结果,外部代码接收后再写入文件
- 使用
with语句管理文件写入,避免手动关闭文件的风险 - 合并了失败状态的判断逻辑,让代码更简洁清晰
这样应该就能正确把所有符合条件的内容写入文件了~
内容的提问来源于stack exchange,提问作者krock1516
相关产品推荐
相关产品推荐

