针对lammps输出的log文件进行数据提取(python/lammps中log文件分析)
不喜欢日常机械式的工作,要学会用自己的头脑来偷懒,省下时间打游戏哈哈哈。
本人也是python初学者(本科主要学java),写的博客也是当下学到的知识,全当做个笔记,一是方便自己日后复习,二也希望有读到本文的大佬指导一二。
首先上部分log文件:
log文件会纪录每步输出的各种能量参数、温度等数据,但我们要把其中一种数据单独拉出来并且绘制成表格,这就需要正则表达式了。
针对log文件中的每行字符串,设置正则表达式:
patten = r'(E_vdwl+s+=+s+[0-9.-]+)'
search = re.search(patten, line)
if search != None:
print(search.groups())
count = count + 1
search = re.findall(r'([0-9.]+)', line)
data[0, count]= float(search[2])
这里我以提取vdwl为例,将log文件中有vdwl的那一行提取出来,提取该行的数据保存至数组中
全部代码:
import numpy as np
import pandas as pd
import re
file_name = "log.lammps" # log 文件名,lammps默认名
max_lines = 10001 #存数据行数
#模式匹配
patten = r'(E_vdwl+s+=+s+[0-9.-]+)' #寻找范德华能,看需要自己修改可输出哪一条数据
f = open(file_name,"r")
data = np.zeros((1,max_lines)) #创建数组, 需要提几种数据就新建几维数组来存
count=-1
for i in range(1,max_lines):
line = f.readline() #按行读取
if re.match(r'(Total wall)', line) != None: #判断是否是正常跑完的log文件
break
search = re.search(patten, line) #寻找对应字条的数据
if search != None:
print(search.groups()) #打印分组验证用
count = count + 1
search = re.findall(r'([0-9.]+)', line) #寻找对应字条的数据 search对象找到三组数据(dihed、impro、vdwl)
data[0, count]= float(search[2]) #存入数组 取search的第三组数据(vdwl)
#...
#...要几种数据就在这里加
data=data[:,0:count] #去除多余0位
data_pd = pd.DataFrame(data)
writer = pd.ExcelWriter('vdwl.xlsx') #以excel表格形式输出,方便origin分析
data_pd.to_excel(writer, 'sheet1', float_format='%.4f')
writer.save()
writer.close()
注意保存的行数是你输出的数据组数加一组初始状态数据。
最后结果:
excel的数据和log文件中想要的数据对比,一模一样,这样就可以做下一步分析了。
如果觉得还不错,可以点个赞嘛,一起学习一起进步。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码