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

显示两者之间差异的示例:

>>> 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 回答