我正在尝试解析一些.out
个文件,以获取每个文件中包含的值E
,然后将这些值与theta
和r
一起绘制为3d表面情节。 theta
和r
的值包含在.out
文件标题名称中:H2O.r{}theta{}.out
。即r在第一个{}
中给出,theta
然后在下一个{}
中给出。 {d}给予r
{1}},给予theta
1 d.p.在文件名中,例如r = 0.90, theta = 190.0
。
我很难遍历文件,并将此信息提取到array E
。我遇到了一个错误:
IndexError:只有整数,切片(:
),省略号(...
),numpy.newaxis(None
)和整数或布尔数组才是有效索引。
但是,如果我将r
数组更改为int
以消除此错误,则r
中的所有值都将变为0
。另外,我从文件中提取E
的代码将不再有效,因为我将输入'H2O.r0.00theta70.out'
,这是一个不存在的文件。有人有什么建议吗?
from numpy import *
import matplotlib.pyplot as plt
import os
os.chdir('C:/Users/myName/ex2/all')
theta = arange(70.0, 161.0, 1, dtype = float)
r = arange(0.70, 1.95, 0.05, dtype = float)
r_2dp = [ '%.2f' % elem for elem in r_O ] # string array, with rounding to match the file names
E = zeros((theta.shape[0],r.shape[0]))
def extract(filename): #extract value from file
filename = open(filename,"r")
for line in filename:
if 'SCF Done' in line:
l = line.split()
p = float(l[4])
return p
for i in r_2dp: #create E array that will allow me to plot E vs r vs theta
for j in theta:
for filename in os.listdir('C:/Users/myName/ex2/all'):
if filename.startswith('H2O'):
filename = 'H2O.r{}theta{}.out'.format(i,j)
E[i,j] = extract(filename)
答案 0 :(得分:1)
一种解决方案是将索引与您可以使用enumerate
完成的文件名相关联;我想你可以把你的循环改成
for i, fn in enumerate(r_2dp):
for j, ti in enumerate(theta):
for filename in os.listdir('C:/Users/myName/ex2/all'):
if filename.startswith('H2O'):
filename = 'H2O.r{}theta{}.out'.format(fn,ti)
E[j,i] = extract(filename)
请注意,我已将E[i,j]
更改为E[j,i]
以正确获取尺寸;你也可以改变两个for循环的顺序或者反过来初始化E
......
未经测试,因为我们无法访问您的文件,但一般的想法应该有用......