2011-09-19 121 views
0

我正在尝试操作以下文件。在循环中打印

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,...

对于j = 0,程序应该输出到前3列,对于j = 1程序应该输出到第二个3列(3,4,5)等等。

最后len函数给出了输入文件中的行数,但是什么函数给出了文件中的列数?

谢谢。

+0

'打印1,2,3'然后再'打印1,2,3'打印两行... – Griwes

回答

1

指出我的错误你并不需要:

  • 使用numpy的
  • 读取一次
  • 整个文件知道多少列
  • 在打印语句结束时使用尴尬的逗号
  • 使用列表下标
  • 使用数学。晶圆厂()
  • 明确地关闭文件

试试这个(未经测试):

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 
+0

非常感谢您帮助我使用此代码。这给了我正在寻找的确切输出。我是一名结构工程博士生,但我不是一名程序员。 –

+0

@Cloud Strife:谢谢你的客气话。请考虑接受答案 - 点击左边的大“勾号”。 –

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]) 
     ... 
0

刚如果您的dtest.txt变大并且您不想重定向您的输出,而是写入distance.dat,尤其是,如果您想使用numpy。感谢@约翰在旧代码;-)

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) 
+0

你确定这是不是OP想要的?您的代码似乎在同一行中的2个点之间打印增量。他的代码在相邻行中的点之间打印三角形。 –

+0

@JohnMachin Ooops,我的坏!只是修复它。 – nye17

+0

'xrange(len(the_whole_file))'......以防万一他的文件变大了? –