使用 Python 从基于关键字的材料数据文件中解析数据

Parse data from keyword based materials data file with Python

我有一个基于关键字的 materials 数据文件。我想解析此文件中的数据并创建变量和矩阵以在 Python 脚本中处理它们。 material 文件可能在最顶部有以字符串“**”开头的注释行,我只是想忽略这些并解析 *keyword_1 形式的关键字后面的其他行上的数据, 以及它们的 param_1=param1.

形式的逗号分隔参数

使用 Python 从这种基于关键字的文本文件中解析数据的最快和最简单的方法是什么?我可以为此使用 pandas 吗?

下面是示例输入 material 文件:alloy_1.nam

*************************************************
**               ALLOY_1 MATERIAL DATA
*************************************************
*MATERIAL,NAME=ALLOY_1
*ELASTIC,TYPE=ISO
2.08E5,0.3,291.
2.04E5,0.3,422.
1.96E5,0.3,589.
1.85E5,0.3,755.
1.74E5,0.3,922.
1.61E5,0.3,1089.
1.52E5,0.3,1220.
*EXPANSION,TYPE=ISO,ZERO=293.
13.5E-6,291.
13.6E-6,422.
13.9E-6,589.
14.2E-6,755.
14.7E-6,922.
15.5E-6,1089.
16.4E-6,1200.
*DENSITY
7.92E-9
*CONDUCTIVITY
10.,273.
18.,873.
27.,1373.
*SPECIFIC HEAT
450.e6,273.
580.e6,873.
710.e6,1373.

方法是创建一个字典列表,其中每个元素是一个键=类别名称和数据框形式的数据。我们必须使用临时字典来存储逗号分隔的数据,每次找到新类别时,这些数据都会附加到字典列表中。

使用pandas.Dataframe()创建数据框

代码如下:

with open('/Users/rpghosh/scikit_learn_data/test.txt') as f:
    lines = f.readlines()

# empty list of dataframes
lst_dfs = []

# empty dictionary to store each dataframe temporarily
d = {}
dfName = ''
PrevdfName = ''
createDF = False

for line in lines:
    
    if re.match('^\*{1}([A-Za-z0-9,=]{1,})\n$', line):
        variable = line.lstrip('*').rstrip().split(',')
        PrevdfName = dfName
        dfName = variable[0]

        createDF = False

        if (not createDF) and len(d) > 0:
            df = pd.DataFrame(d)
            # append a dictionary which has category and dataframe
            lst_dfs.append( { PrevdfName : df} )
            d = {}
            
        
    elif re.match('^[0-9]([0-9,]){1,}\n$',line):
        #dfName = PrevdfName
        data = line.rstrip().split(',')

        
        for i in range(len(data)):
        
            # customised column name 
            colName = 'col' + str(i+1)

            # if the colname is already present in the 
            # dictionary keys then append the element 
            # to existing key's list
            if colName in d.keys():
                d[colName].append( data[i])
            else:
                d[colName] = [data[i]]                
    else:
        createDF = False
        d={}

df = pd.DataFrame(d)
lst_dfs.append({ dfName : df})

要查看输出,您将有一个数据帧列表,因此代码将为 -

for idx, df in enumerate(lst_dfs):
    print(f"{idx=}")
    print(df)
    print()

输出:

idx=0
{'elastic':   col1 col2 col3
0   21   22   23
1   11   12   13
2   31   32   33}

idx=1
{'expansion':   col1 col2 col3
0    4    5    6
1   41   15   16
2   42   25   26}

idx=2
{'density':     col1
0  12343}

idx=3
{'conductivity':   col1 col2 col3 col4 col5 col6
0   54   55   56   51   55   56
1   42   55   56   51   55   56
2   54   55   56   51   55   56
3   42   55   56   51   55   56}