2013-01-21 92 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來逐步瀏覽您的程序。尤其是交互式調試對學習新語言和新概念非常重要。

相關問題