我有以下文件我试图操纵。
1 2 -3 5 10 8.2
5 8 5 4 0 6
4 3 2 3 -2 15
-3 4 0 2 4 2.33
2 1 1 1 2.5 0
0 2 6 0 8 5
该文件只包含数字。
我正在尝试编写一个程序来相互减去行并将结果打印到文件中。我的程序在下面,dtest.txt
是输入文件的名称。该计划的名称为make_distance.py
。
from math import *
posnfile = open("dtest.txt","r")
posn = posnfile.readlines()
posnfile.close()
for i in range (len(posn)-1):
for j in range (0,1):
if (j == 0):
Xp = float(posn[i].split()[0])
Yp = float(posn[i].split()[1])
Zp = float(posn[i].split()[2])
Xc = float(posn[i+1].split()[0])
Yc = float(posn[i+1].split()[1])
Zc = float(posn[i+1].split()[2])
else:
Xp = float(posn[i].split()[3*j+1])
Yp = float(posn[i].split()[3*j+2])
Zp = float(posn[i].split()[3*j+3])
Xc = float(posn[i+1].split()[3*j+1])
Yc = float(posn[i+1].split()[3*j+2])
Zc = float(posn[i+1].split()[3*j+3])
Px = fabs(Xc-Xp)
Py = fabs(Yc-Yp)
Pz = fabs(Zc-Zp)
print Px,Py,Pz
程序正在正确计算值,但是当我尝试调用程序来编写输出文件时,
mpipython make_distance.py > distance.dat
输出文件(distance.dat
)只包含3列,当它应该包含6时。如何告诉程序将要打印的列移动到每个步骤j = 0,1,.... / p>
对于j = 0,程序应输出到前3列,对于j = 1,程序应输出到后3列(3,4,5),依此类推。
最后,len
函数给出了输入文件中的行数,但是,哪个函数给出了文件中的列数?
感谢。
答案 0 :(得分:5)
在,
语句的末尾添加print
,它不会打印换行符,然后当您退出for循环时添加一个print
以移至下一个行:
for j in range (0,1):
...
print Px,Py,Pz,
print
假设所有行的列数相同,您可以使用len(row.split())
获取列数。
另外,你肯定可以缩短你的代码,我不确定j
的目的是什么,但以下内容应该等同于你现在正在做的事情:
for j in range (0,1):
Xp, Yp, Zp = map(float, posn[i].split()[3*j:3*j+3])
Xc, Yc, Zc = map(float, posn[i+1].split()[3*j:3*j+3])
...
答案 1 :(得分:1)
您不需要:
试试这个(未经测试):
with open("dtest.txt", "r") as posnfile:
previous = None
for line in posnfile:
current = [float(x) for x in line.split()]
if previous:
delta = [abs(c - p) for c, p in zip(current, previous)]
print ' '.join(str(d) for d in delta)
previous = current
答案 2 :(得分:0)
以防万一dtest.txt
变大,您不想重定向输出,而是写入distance.dat
,尤其是如果您想使用numpy
。感谢@John指出我在旧代码中的错误; - )
import numpy as np
pos = np.genfromtxt("dtest.txt")
dis = np.array([np.abs(pos[j+1] - pos[j]) for j in xrange(len(pos)-1)])
np.savetxt("distance.dat",dis)