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谢谢你的评论。请参阅更新后的帖子