2017-08-10 58 views
0

我有一些問題避免我的代碼重複自己,就像標題所說的,當我從txt文件導入數據時。我的問題是,如果有更聰明的方式來循環功能。一般來說,我仍然對Python非常陌生,所以我對這方面的知識還不夠。從txt文件中排序信息時重複代碼 - Python

,我正在使用的代碼如下

with open("fundamenta.txt") as fundamenta: 
    fundamenta_list = [] 
    for row in fundamenta: 
     info_1 = row.strip() 
     fundamenta_list.append(info_1) 

namerow_1 = fundamenta_list[1] 
sol_1 = fundamenta_list[2] 
pe_1 = fundamenta_list[3] 
ps_1 = fundamenta_list[4] 
namerow_2 = fundamenta_list[5] 
sol_2 = fundamenta_list[6] 
pe_2 = fundamenta_list[7] 
ps_2 = fundamenta_list[8] 
namerow_3 = fundamenta_list[9] 
sol_3 = fundamenta_list[10] 
pe_3 = fundamenta_list[11] 
ps_3 = fundamenta_list[12] 

所以,當代碼從「fundamenta_list」讀我怎麼改,以防止重複的代碼?

+0

爲什麼你必須將所有的信息插入這些變量?您可以直接從'fundamenta_list'訪問數據。 – Moyote

+0

我從變量創建對象。當時這些數字是3,但在未來,這個列表會變得更大,因此我認爲需要更加標準化的方法! – Jurkka

+0

我不確定你的意思是「我的問題是,如果有更聰明的方法來循環功能」。你的示例代碼中沒有任何功能。下面的答案是否對你有幫助? – Moyote

回答

0

在我看來,你的輸入文件中有記錄每個爲4行的塊,因此依次爲namerow,sol,pe,ps,並且您將創建採用這4個字段的對象。假設你的對象被稱爲MyObject,你可以這樣做:

with open("test.data") as f: 
    objects = [] 
    while f: 
     try: 
      (namerow, sol, pe, ps) = next(f).strip(), next(f).strip(), next(f).strip(), next(f).strip() 
      objects.append(MyObject(namerow, sol, pe, ps)) 
     except: 
      break 

那麼你就可以訪問你的對象作爲objects[0]

你甚至可以把它變成返回對象的名單就像Moyote的功能回答。

0

如果我正確理解你的問題,你可能想從你的代碼中創建一個函數,所以你可以避免重複相同的代碼。

你可以這樣做:

def read_file_and_save_to_list(file_name): 
    with open(file_name) as f: 
    list_to_return = [] 
    for row in f: 
     list_to_return.append(row.strip()) 
    return list_to_return 

然後事後你可以這樣調用該函數:

fundamenta_list = read_file_and_save_to_list("fundamenta.txt") 
+0

這看起來很有前途,是的,這就是我的意思!對不起,如果我不清楚。我會馬上試試這個! – Jurkka

+0

@Jurkka,有幫助嗎? – Moyote

+0

我想用代碼來改進的東西是諸如「namerow_1」等變量,因此代碼可以讀取無限長的txt文件並按照相同的模式創建對象。所以我猜想需要某種循環來解決這個問題,那就是我面臨的更大的問題。你有什麼想法如何解決這個問題? – Jurkka