如何用Python提取模拟日志中指定变量的初始残差值并存入数组?
提取模拟日志中初始残差值的Python实现
问题描述
我有一份如下所示的模拟日志:
Time = 1 smoothSolver: Solving for Ux, Initial residual = 1, Final residual = 0.0289664, No Iterations 2 smoothSolver: Solving for Uy, Initial residual = 1, Final residual = 0.028966, No Iterations 2 smoothSolver: Solving for Uz, Initial residual = 1, Final residual = 0.0842607, No Iterations 1 GAMG: Solving for p, Initial residual = 1, Final residual = 0.0471791, No Iterations 120 time step continuity errors : sum local = 0.000235896, global = -4.03834e-05, cumulative = -4.03834e-05 smoothSolver: Solving for epsilon, Initial residual = 0.239416, Final residual = 0.0154473, No Iterations 1 smoothSolver: Solving for k, Initial residual = 1, Final residual = 0.0534371, No Iterations 2 ExecutionTime = 9.27 s ClockTime = 10 s希望使用Python提取Ux、Uy、Uz、p、epsilon和k的初始残差值,并将其存储到数组中,请问该如何实现?
解决方案
利用Python的正则表达式模块re精准匹配日志中目标变量的初始残差值,具体实现如下:
代码实现
import re # 日志内容(若日志存于文件,替换为下方的文件读取逻辑) log_content = """Time = 1 smoothSolver: Solving for Ux, Initial residual = 1, Final residual = 0.0289664, No Iterations 2 smoothSolver: Solving for Uy, Initial residual = 1, Final residual = 0.028966, No Iterations 2 smoothSolver: Solving for Uz, Initial residual = 1, Final residual = 0.0842607, No Iterations 1 GAMG: Solving for p, Initial residual = 1, Final residual = 0.0471791, No Iterations 120 time step continuity errors : sum local = 0.000235896, global = -4.03834e-05, cumulative = -4.03834e-05 smoothSolver: Solving for epsilon, Initial residual = 0.239416, Final residual = 0.0154473, No Iterations 1 smoothSolver: Solving for k, Initial residual = 1, Final residual = 0.0534371, No Iterations 2 ExecutionTime = 9.27 s ClockTime = 10 s""" # 指定需要提取的目标变量 target_vars = ['Ux', 'Uy', 'Uz', 'p', 'epsilon', 'k'] # 正则模式:匹配变量名和对应的初始残差值 residual_pattern = re.compile(r'Solving for (\w+), Initial residual = ([\d.e-]+)') # 存储结果的数组 initial_residuals = [] # 遍历所有匹配结果,筛选目标变量的残差值 for match in residual_pattern.finditer(log_content): var = match.group(1) if var in target_vars: initial_residuals.append(float(match.group(2))) # 输出结果 print("提取的初始残差值数组:", initial_residuals)
代码说明
- 正则模式解析:
r'Solving for (\w+), Initial residual = ([\d.e-]+)'捕获两个关键部分:(\w+):匹配变量名(如Ux、p、epsilon)([\d.e-]+):匹配初始残差值,支持整数、小数和科学计数法格式
- 目标变量筛选:通过
target_vars列表指定需要提取的变量,只保留符合要求的残差值 - 文件读取适配:如果日志存储在文件中,将
log_content替换为以下代码即可:with open('你的日志文件名.log', 'r') as f: log_content = f.read()
执行结果
运行代码后,会输出按Ux、Uy、Uz、p、epsilon、k顺序排列的初始残差值数组:
提取的初始残差值数组: [1.0, 1.0, 1.0, 1.0, 0.239416, 1.0]
内容的提问来源于stack exchange,提问作者Nico Su
相关产品推荐
相关产品推荐

