0

以下のスクリプトを使用して、軌跡ファイルからデータを抽出し、そのデータを新しいファイル ファイルにダンプしています。ディレクティブ ">" を使用して結果をファイルにリダイレクトできますが、2000 個を超えるファイルに対してはこのようにする必要があります。物事を簡単にするために、ファイルを開こうとし、Python自体が結果をファイルに送信できるようにしました。

これを実現するために、コードの (##) の場所に行を追加して、以下に示すようにファイルを開きました。また、次のコードの行に (###) が含まれているように、結果をファイルに送信する行を追加しました。

#!/usr/bin/env python
'''
always put -- #!/usr/bin/env python -- at the shebang
'''

from Scientific.IO.NetCDF import NetCDFFile as Dataset
import itertools as itx


inputfile = "../traj-waters/waters1445-MD001-run1000.traj"


for FRAMES in range(0,2):
   frame = FRAMES

   text_file = open("velo-Output.dat", "w")   (##)

   #inputfile = 'mdcrd'
   ppp = inputfile

   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(inpitfile, 'r')
   ncfile = Dataset(ppp, 'r')

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

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

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


   '''
   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\n' % z))  (###)
           elif (len(z) == formatxyzshort_size): print formatxyzshort % z


   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()

しかし、このコードを以下のように実行するとエラーが発生します。

  Traceback (most recent call last):
File "./Nctorst-onlyVelo.py", line 73, in <module>
  text_file.write(str('formatxyz\n' % z))
TypeError: not all arguments converted during string formatting

私はPythonの初心者なので、この問題を修正するのに迷っています。

助けてくれてありがとう。よろしく

4

2 に答える 2

1

入力ミスをしたか、置換演算子を使用した文字列の書式設定がどのように 機能するかを理解していませんでした

この線

text_file.write('formatxyz\n' % z))  (###)

前の行と同様に記述する必要があります

text_file.write(formatxyz % z + '\n')  (###)

また、フォーマット文字列構文を使用することを楽しみにしてください。

于 2013-01-21T06:47:12.233 に答える
0

print formatxyz % z <-- ここではモジュロ演算子です

text_file.write('formatxyz\n' % z)) (###) <--- これは文字列の置換です。使用禁止

formatxyz\n' 文字列として。

代わりにこれを行います:

 text_file.write(str(formatxyz % z ) + '\n' )

2 つの違いを示す例:

>>> formatxyz = 97
>>> z = 10
>>> formatxyz % z
7
>>> 'formatxyz' % z
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
>>> x = 'Hello world'
>>> 'formatxyz is %s' % x
'formatxyz is Hello world'
于 2013-01-21T06:42:34.953 に答える