2011-09-19 119 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))'......以防萬一他的文件變大了? –