我的项目包括编写一个从文本文件中提取某些数据(数字)的程序,该程序必须通用化,以使用相同格式的不同文本文件。
该文件是对分子的分析,要提取的数据是分子内每个原子的坐标,因此必须以一种方式推广,即提取与不同文件中的原子一样多的数据。 / p>
这是我到目前为止所提出的:
def Prog1():
f=open( "C:/dimer.out","r" )
m=open("C:/dimer1.out","w")
g=f.readlines()
for k in range(len(g)):
if "Standard" in g[k]:
c=k
for n in range(c+5, len(g)):
m.write(g[n])
if "------------" in g[n+1]:
break
这基本上用信息提取行,并根据文件格式以通用方式将它们写入新的文本文件中。 (带有信息的行总是在包含'标准'的行之后的5行开始,并且后面跟着一行有很多'-----'的行。 然后;
def Prog2():
X=[]
Y=[]
Z=[]
m=open('C:/dimer1.out','r')
n=0
for line in m:
n+=1
k=n
data = csv.reader(m, delimiter=" ")
for i in range(k):
M=next(data)
while '' in M:
M.remove('')
X.append(M[3])
Y.append(M[4])
Z.append(M[5])
这是为了提取这些行中的确切数据并将它们放在各自的列表中。 (数据和数据之间有空格可以接受多个字符的数字。但我在M = next(数据)上收到错误'Stopiteration'。错误是什么?或者我如何修改它以便工作?
提前致谢:)
答案 0 :(得分:0)
问题在于这两条线:
m = open('C:/dimer1.out', 'r')
for line in m:
n += 1
...
data = csv.reader(m, delimiter=' ')
for i in range(k):
M = next(data)
完成for line in m
后,您已经耗尽了文件对象。文件头现在位于文件的末尾,所以当你再次以csv.reader
的形式阅读它时,你没有想出任何东西。
在for line in m
循环和for i in range(k)
循环之间的任何点,都执行m.seek(0)
。这会将文件头放回文件的开头,并允许您再次阅读它。