2012-05-02 28 views
2

我有轉換(U,V)的Python代碼(S,d):如何提取* .txt文件中的數據並在Python中使用它?

def d2r(d): 
    r = d * math.pi/180.0 
    return (r) 


def r2d(r): 
    d = r * 180.0/math.pi 
    return (d) 


def sd2uv(s,d): 
    r = d2r(d) 
    u = s * math.sin(r) 
    v = s * math.cos(r) 
    return (u,v) 


def uv2sd(u,v): 
    s = math.sqrt((u*u)+(v*v)) 
    r = math.atan2(u,v) 
    d = r2d(r) 
    if d < 0: 
    d = 360 + d 
    return (s,d) 

數據被存儲在u.txt在U,每一行都有一個號碼; v數據存儲在v.txt中,每行也有一個數字。我的問題是如何從這兩個文件中提取數據,然後在Python代碼中使用它們來打印(s,d)?謝謝!

+0

每行對應兩個文檔中的另一行嗎?換句話說,第一個「u」值是否與第一個「v」值匹配,第二個「u」是否與第二個「v」匹配? –

+0

另外,作爲一個建議 - 我會考慮重命名變量u,v,s和d。對於從未看過這段代碼的人來說,這可能並不明顯。例如,您可以考慮命名「r2d」「radians_to_degrees」或「rads_to_degrees」。它會幫助像我這樣的人不確定這些值可能意味着什麼。 –

+0

是的,他們相互通信,謝謝你的建議! –

回答

3

我想這應該這樣做:

with open('u.txt') as uf, open('v.txt') as vf: 
    for u,v in zip(uf,vf): 
     print uv2sd(float(u),float(v)) 
+0

雖然OP可能正在閱讀浮動,並且在這種情況下應該用'float'替換int。 –

+0

是的,我剛剛做到了。不過謝謝。 – Akavall

0
from itertools import izip, imap 
with open('u.txt') as u_data, open('v.txt') as v_data: 
    for u,v in imap(float, izip(u_data, v_data)): 
     print uv2sd(u, v) 
0

我能想象這樣的方式有兩種:

  1. 閱讀所有從每個文件中的數據分成兩個單獨的列表。遍歷這兩個列表並計算每個值,直到到達其中一個列表的末尾。
  2. 一次從每個文件中讀取一行。計算您正在查找的值。重複,直到你用盡了這兩個文件。

第一點的優點是保存後續使用的數據(如果需要),而不必打開&再次讀取文件。如果文件中有非常大的數據集,這可能無法正常工作。

如果您只需要在程序中使用一次數據,第二點的優點是可以節省一些內存。如果您需要重複使用數據,這可能會變慢。

第一種方式可以是這樣的:

with open('u.txt') as u_file, open('v.txt') as v_file: 
    u_values = u_file.readlines() 
    v_values = v_file.readlines() 

for u, v in zip(u_values, v_values): 
    print uv2sd(float(u), float(v)) 

# We can use u_values and v_values again if we need to now 

第二種方式是什麼Akavall和gnibbler想出了。

相關問題