我使用下面的脚本从某些轨迹文件中提取数据并将数据转储到新的文件文件中。我可以使用指令“>”将结果重定向到一个文件,但我需要这样做超过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的新手,我发现丢失了以解决这个问题。
预先感谢您的帮助。 此致
答案 0 :(得分:1)
要么你犯了一个错字,要么不明白string formating with replacement operator是如何运作的
The Line
text_file.write('formatxyz\n' % z)) (###)
应该写成类似于前一行的
text_file.write(formatxyz % z + '\n') (###)
此外,您应该期待使用Format String Syntax
答案 1 :(得分:0)
print formatxyz % z
&lt; - 这里是模运算符
text_file.write('formatxyz\n' % z))
(###)&lt; ---这里是字符串替换。不要使用
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'