2013-01-21 93 views
0

下面是从分子动力学轨迹数据中读取速度值的脚本。我有许多弹道文件,其名称模式如下:根据输入文件名生成输出文件名

waters1445-MD001-run0100.traj 
waters1445-MD001-run0200.traj 
waters1445-MD001-run0300.traj 
waters1445-MD001-run0400.traj 
waters1445-MD001-run0500.traj 
waters1445-MD001-run0600.traj 
waters1445-MD001-run0700.traj 
waters1445-MD001-run0800.traj 
waters1445-MD001-run0900.traj 
waters1445-MD001-run1000.traj 
waters1445-MD002-run0100.traj 
waters1445-MD002-run0200.traj 
waters1445-MD002-run0300.traj 
waters1445-MD002-run0400.traj 
waters1445-MD002-run0500.traj 
waters1445-MD002-run0600.traj 
waters1445-MD002-run0700.traj 
waters1445-MD002-run0800.traj 
waters1445-MD002-run0900.traj 
waters1445-MD002-run1000.traj 

每个文件都有200帧数据要分析。所以我计划以这种方式代码应该在每个traj文件(如上所示)中一个接一个地读取,并提取速度值并写入特定文件(text_file = open(“Output.traj.dat”, “A”)对应于各个输入的轨迹文件。

所以我定义了一个名为“环(MMM)”功能,其中“MMM”是一个轨迹的文件名解析器功能“循环”。

#!/usr/bin/env python 
''' 
always put #!/usr/bin/env python at the shebang 
''' 
#from __future__ import print_function 
from Scientific.IO.NetCDF import NetCDFFile as Dataset 
import itertools as itx 
import sys 
##################### 


def loops(mmm): 
    inputfile = mmm 

    for FRAMES in range(0,200): 
     frame = FRAMES 
     text_file = open("Output.mmm.dat", "a") 

     def grouper(n, iterable, fillvalue=None): 
     args = [iter(iterable)] * n 
     return itx.izip_longest(fillvalue=fillvalue, *args) 

    formatxyz = "%12.7f%12.7f%12.7f%12.7f%12.7f%12.7f" 
    formatxyz_size = 6 
    formatxyzshort = "%12.7f%12.7f%12.7f" 
    formatxyzshort_size = 3 

    #ncfile = Dataset(inputfile, 'r') 
    ncfile = Dataset(ppp, 'r') 

    variableNames = ncfile.variables.keys() 
    #print variableNames 

    shape = ncfile.variables['coordinates'].shape 
    ''' 
    do the header 
    ''' 

    print 'title ' + str(frame) 
    text_file.write('title ' + str(frame) + '\n') 
    print "%5i%15.7e" % (shape[1],ncfile.variables['time'][frame]) 
    text_file.write("%5i%15.7e" % (shape[1],ncfile.variables['time']\ 
    [frame]) + '\n') 

    ''' 
    do the velocities 
    ''' 
    try: 
     xyz = ncfile.variables['velocities'][frame] 
     temp = grouper(2, xyz, "") 

     for i in temp: 
      z = tuple(itx.chain(*i)) 
      if (len(z) == formatxyz_size): 
       print formatxyz % z 
       text_file.write(formatxyz % z + '\n') 
      elif (len(z) == formatxyzshort_size): 
       print formatxyzshort % z 
       text_file.write(formatxyzshort % z + '\n') 

    except(KeyError): 
     xyz = [0] * shape[2] 
     xyz = [xyz] * shape[1] 
     temp = grouper(2, xyz, "") 

     for i in temp: 
      z = tuple(itx.chain(*i)) 
      if (len(z) == formatxyz_size): 
       print formatxyz % z 
      elif (len(z) == formatxyzshort_size): 
       print formatxyzshort % z 
      x = ncfile.variables['cell_angles'][frame] 
      y = ncfile.variables['cell_lengths'][frame] 

#text_file.close() 


# program starts - generation of file name 
for md in range(1,3): 
    if md < 10: 
     for pico in range(100,1100, 100): 
     if pico >= 1000: 
      kkk = "waters1445-MD00{0}-run{1}.traj".format(md,pico) 
      loops(kkk) 
     elif pico < 1000: 
      kkk = "waters1445-MD00{0}-run0{1}.traj".format(md,pico) 
      loops(kkk) 

     #print kkk 

在(#程序开始 - 文件名的生成)行中,代码应该生成文件名,并相应地调用函数并提取速度并转储(text_file = open(“Output.mmm.dat “,”a“)

执行此代码时,程序正在运行,但不幸的是无法根据输入轨迹文件名生成输出文件。

我想要的输出文件名是:

velo-waters1445-MD001-run0100.dat 
velo-waters1445-MD001-run0200.dat 
velo-waters1445-MD001-run0300.dat 
velo-waters1445-MD001-run0400.dat 
velo-waters1445-MD001-run0500.dat 
. 
. 
. 

我无法追踪,我需要做的改变。

+0

你能检查上面代码中的缩进吗?它看起来像是在'for'循环中打开文件,但写入发生在它之外。 –

+0

是的..这就是我写的。首先打开mmm文件。那是轨迹文件。然后对于该轨迹文件,它假定打开输出文件并写入。代码正在运行。无论如何是算法需要改变? – Vijay

回答

0

您的代码的缩进已损坏:第一次分配至formatxyz,以下代码未与def grouperfor FRAMES对齐。

主要的问题可能是(像约翰内斯已经评论过的那样)当你打开文件写入时以及当你真正将数据写入文件时。

检查:

for FRAMES in range(0,200): 
    frame = FRAMES 
    text_file = open("Output.mmm.dat", "a") 

输出文件名为(硬编码)Output.mmm.dat。更改为"Output.{0}.dat".format(mmm)。但是,变量mmm在循环内永远不会改变。这可能是好的,如果所有的帧都应该写入同一个文件。

一般来说,请处理您选择的变量和函数的名称。 loops是非常通用的,并且kkkmmm也是如此。更具体一些,它有助于调试。如果您不知道发生了什么以及程序出错的位置,请插入print("dbg> do (a)")陈述以及一些描述性文字和/或使用the Python debugger来逐步浏览您的程序。尤其是交互式调试对学习新语言和新概念非常重要。

相关问题