Python 嵌套不同长度的数组上的for循环,并相应地生成文件

Python 嵌套不同长度的数组上的for循环,并相应地生成文件,python,numpy,for-loop,multidimensional-array,nested,Python,Numpy,For Loop,Multidimensional Array,Nested,我有两个文件:V1.out和V2.out: LATTICE PARAMETERS (ANGSTROMS AND DEGREES) - PRIMITIVE CELL A B C ALPHA BETA GAMMA VOLUME 6.08566 5.03702 7.64745 90.00000 105.09618 90.00000 226.331804

我有两个文件:
V1.out
V2.out

LATTICE PARAMETERS  (ANGSTROMS AND DEGREES) - PRIMITIVE CELL
       A          B          C        ALPHA      BETA     GAMMA        VOLUME
    6.08566    5.03702    7.64745    90.00000 105.09618  90.00000    226.331804

                          AU/CELL
 EL            :   -3765.004233655181
 E0            :       0.073893382446

 TEMPERATURE FOR THERMO ANALYSIS   10.00 KELVIN - 2000.00 KELVIN (POINTS4)

 AT (T =   10.00 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000000028637       0.000000779258           0.00007519
 TS            :       0.000000031491       0.000000856925           0.00008268


 AT (T =   30.10 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000035934511       0.000977827744           0.09434604
 TS            :       0.000045071597       0.001226460503           0.11833546


 AT (T =   50.20 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000247740762       0.006741368865           0.65044328
 TS            :       0.000333253672       0.009068293427           0.87495739


 AT (T =   70.30 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000711121913       0.019350611008           1.86705032
 TS            :       0.001003762120       0.027313755902           2.63537708
 LATTICE PARAMETERS  (ANGSTROMS AND DEGREES) - PRIMITIVE CELL
       A          B          C        ALPHA      BETA     GAMMA        VOLUME
    6.13522    5.04903    7.66206    90.00000 105.40656  90.00000    228.817957

 TEMPERATURE FOR THERMO ANALYSIS   10.00 KELVIN - 2000.00 KELVIN (POINTS4)

                          AU/CELL             EV/CELL                 KJ/MOL
 EL            :   -3765.007272400268 -102451.056393071922    -9885025.20063421
 E0            :       0.073470147948       1.999224364265         192.89584625

 AT (T =   10.00 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000000041695       0.000001134585           0.00010947
 TS            :       0.000000046017       0.000001252179           0.00012082


 AT (T =   30.10 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000040732367       0.001108384059           0.10694281
 TS            :       0.000051455315       0.001400170298           0.13509591

 AT (T =   50.20 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000266315355       0.007246809228           0.69921087
 TS            :       0.000361155871       0.009827550878           0.94821461

 AT (T =   70.30 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000747534260       0.020341441355           1.96265092
 TS            :       0.001063768303       0.028946607140           2.79292329
它们都具有以下结构:每个文件包含三个变量:
VOLUME
EL
E0
。此外,对于每个温度
T
,都有一个值
ET
TS
关联:

V1.out

LATTICE PARAMETERS  (ANGSTROMS AND DEGREES) - PRIMITIVE CELL
       A          B          C        ALPHA      BETA     GAMMA        VOLUME
    6.08566    5.03702    7.64745    90.00000 105.09618  90.00000    226.331804

                          AU/CELL
 EL            :   -3765.004233655181
 E0            :       0.073893382446

 TEMPERATURE FOR THERMO ANALYSIS   10.00 KELVIN - 2000.00 KELVIN (POINTS4)

 AT (T =   10.00 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000000028637       0.000000779258           0.00007519
 TS            :       0.000000031491       0.000000856925           0.00008268


 AT (T =   30.10 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000035934511       0.000977827744           0.09434604
 TS            :       0.000045071597       0.001226460503           0.11833546


 AT (T =   50.20 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000247740762       0.006741368865           0.65044328
 TS            :       0.000333253672       0.009068293427           0.87495739


 AT (T =   70.30 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000711121913       0.019350611008           1.86705032
 TS            :       0.001003762120       0.027313755902           2.63537708
 LATTICE PARAMETERS  (ANGSTROMS AND DEGREES) - PRIMITIVE CELL
       A          B          C        ALPHA      BETA     GAMMA        VOLUME
    6.13522    5.04903    7.66206    90.00000 105.40656  90.00000    228.817957

 TEMPERATURE FOR THERMO ANALYSIS   10.00 KELVIN - 2000.00 KELVIN (POINTS4)

                          AU/CELL             EV/CELL                 KJ/MOL
 EL            :   -3765.007272400268 -102451.056393071922    -9885025.20063421
 E0            :       0.073470147948       1.999224364265         192.89584625

 AT (T =   10.00 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000000041695       0.000001134585           0.00010947
 TS            :       0.000000046017       0.000001252179           0.00012082


 AT (T =   30.10 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000040732367       0.001108384059           0.10694281
 TS            :       0.000051455315       0.001400170298           0.13509591

 AT (T =   50.20 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000266315355       0.007246809228           0.69921087
 TS            :       0.000361155871       0.009827550878           0.94821461

 AT (T =   70.30 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000747534260       0.020341441355           1.96265092
 TS            :       0.001063768303       0.028946607140           2.79292329
V2.out

LATTICE PARAMETERS  (ANGSTROMS AND DEGREES) - PRIMITIVE CELL
       A          B          C        ALPHA      BETA     GAMMA        VOLUME
    6.08566    5.03702    7.64745    90.00000 105.09618  90.00000    226.331804

                          AU/CELL
 EL            :   -3765.004233655181
 E0            :       0.073893382446

 TEMPERATURE FOR THERMO ANALYSIS   10.00 KELVIN - 2000.00 KELVIN (POINTS4)

 AT (T =   10.00 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000000028637       0.000000779258           0.00007519
 TS            :       0.000000031491       0.000000856925           0.00008268


 AT (T =   30.10 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000035934511       0.000977827744           0.09434604
 TS            :       0.000045071597       0.001226460503           0.11833546


 AT (T =   50.20 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000247740762       0.006741368865           0.65044328
 TS            :       0.000333253672       0.009068293427           0.87495739


 AT (T =   70.30 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000711121913       0.019350611008           1.86705032
 TS            :       0.001003762120       0.027313755902           2.63537708
 LATTICE PARAMETERS  (ANGSTROMS AND DEGREES) - PRIMITIVE CELL
       A          B          C        ALPHA      BETA     GAMMA        VOLUME
    6.13522    5.04903    7.66206    90.00000 105.40656  90.00000    228.817957

 TEMPERATURE FOR THERMO ANALYSIS   10.00 KELVIN - 2000.00 KELVIN (POINTS4)

                          AU/CELL             EV/CELL                 KJ/MOL
 EL            :   -3765.007272400268 -102451.056393071922    -9885025.20063421
 E0            :       0.073470147948       1.999224364265         192.89584625

 AT (T =   10.00 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000000041695       0.000001134585           0.00010947
 TS            :       0.000000046017       0.000001252179           0.00012082


 AT (T =   30.10 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000040732367       0.001108384059           0.10694281
 TS            :       0.000051455315       0.001400170298           0.13509591

 AT (T =   50.20 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000266315355       0.007246809228           0.69921087
 TS            :       0.000361155871       0.009827550878           0.94821461

 AT (T =   70.30 K, P =   0.10132500E+00 MPA):

                          AU/CELL             EV/CELL                 KJ/MOL
 ET            :       0.000747534260       0.020341441355           1.96265092
 TS            :       0.001063768303       0.028946607140           2.79292329
我想创建四个文件:

T_10.00K.dat
T_30.10K.dat
T_50.20K.dat
T_70.30K.dat
这将包括:

T_10.00.dat                       |    T_30.10.dat                 |    T_50.20.dat                  |    T_70.30.dat
---------------------------------------------------------------------------------------------------- ---------------------------------
VOLUME:           F:              | VOLUME:           F:           | VOLUME:           F:            | VOLUME:           F:
                                  |                                |                                 |
V1              F(V1, T=10.00)    | V1              F(V1, T=30.10) | V1              F(V1, T=50.20)  | V1              F(V1, T=70.30)
V2              F(V2, T=10.00)    | V2              F(V2, T=30.10) | V2              F(V2, T=50.20)  | V2              F(V2, T=70.30)
其中,对于特定温度和体积,变量
F
的计算公式如下:

F = EL + E0 + ET -TS
我已经能够提取每个
EL
E0
变量;除了
ET
TS
每个温度的变量:

import re
import os
import glob
from itertools import islice
import numpy as np
import sys

n_volume = []
path='./'
template = os.path.join(path, '*.out')


# Extracting each thermodynamic variable:
ET = []
TS = []
EL = []
E0 = []
VOLUME_EACH = []
T = []

for fname in glob.glob(template):
  print fname
  f = open(fname, 'r')
  real_part = False

  for line in f:

        if re.match(r"^ ET            :", line):
         start = line.find(':') + 8
         end = line.find(':') + 22
         result_ET = line[start:end]
         ET.append(result_ET)

        if re.match(r"^ TS            :", line):
         start = line.find(':') + 8
         end = line.find(':') + 22
         result_TS = line[start:end]
         TS.append(result_TS)

        if re.match(r"^ EL            :", line):
         start = line.find(':') + 4
         end = line.find(':') + 22
         result_EL = line[start:end]
         EL.append(result_EL)

        if re.match(r"^ E0            :", line):
         start = line.find(':') + 8
         end = line.find(':') + 22
         result_E0 = line[start:end]
         E0.append(result_E0)

        if re.match(r"^ AT \(T =", line):
         start = line.find('T =') + 4
         end = line.find('K')
         result_Temperatures = line[start:end]
         T.append(result_Temperatures)

        if 'LATTICE PARAMETERS  (ANGSTROMS AND DEGREES) - PRIMITIVE CELL' in line:
                  print "line 1 = ", line
                  f.next()
                  each_volume_times_4 = []
                  each_volume_times_100 = []

                  parameters = (''.join(islice(f, 1)))
                  columns = parameters.split()
                  each_volume = columns[6]
                  print 'each_volume = ', each_volume

                  VOLUME_EACH.append(each_volume)

# Transform each element of the list from <str> to <float64>:
VOLUME_EACH = [float(i) for i in VOLUME_EACH]
EL = [float(i) for i in EL]
E0 = [float(i) for i in E0]
ET = [float(i) for i in ET]
TS = [float(i) for i in TS]
T = [float(i) for i in T]

# Transform each element of the list to a numpy array:
VOLUME_EACH = np.array(VOLUME_EACH)
EL = np.array(EL)
E0 = np.array(E0)
ET = np.array(ET)
TS = np.array(TS)
T = np.array(T)

print 'VOLUME_EACH = ', VOLUME_EACH
print 'len(VOLUME_EACH) =  ' , len(VOLUME_EACH)

print 'EL = ', EL
print 'len(EL) =  ' , len(EL)

print 'E0 = ', E0
print 'len(E0) =  ' , len(E0)

print 'T = ', T
print 'len(T) =  ' , len(T)

print 'ET = ', ET
print 'len(ET) =  ' , len(ET)

print 'TS = ', TS
print 'len(TS) =  ' , len(TS)

F_ALL = []
for Vols in VOLUME_EACH:
   aux = []
   for Ts, (ETs, TSs) in enumerate(zip(ET, TS)):
      F_for_each_Vol = EL + E0 + ET - TS
      aux.append(F_for_each_Vol)
F_ALL.append(aux)

print  F_ALL
温度数组
T
恰好包含来自
V1.dat
V2.dat
的温度

ET
TS
变量在每个
体积的每个温度下都不同。我所能想到的最好的方法是通过使用1-D数组来提取这些数据。但是,这会导致长度不匹配

如何更好地提取
ET
TS
变量,以避免上述不匹配

例如,对于
V1.dat
,对于T=10.00k,我们有以下信息:

VOLUME = 226.331804
EL            :   -3765.004233655181
E0            :       0.073893382446
ET            :       0.000000028637
TS            :       0.000000031491
如果我们手动汇总,我们得到:

F(V1,T=10.00)=-3765.004233655181+0.073893382446+0.000000028637-0.000000031491=-3764.93034027559


检查缩进。如图所示,F_ALL将只包含一个element@kdopen谢谢你的评论。请参阅更新后的帖子