2015-11-09 152 views
0

我需要編寫一個程序來寫入和讀取文件。我有代碼,這取決於我稱之爲函數的順序。Python文件處理

def FileSetup(): 
    TextWrite = open('Leaderboard.txt','w') 
    TextWrite.write('''| Driver |  Car  |  Team  |  Grid  | Fastest Lap | Race Time | Points | 
''') 
    TextWrite.close() 
    TextRead = open('Leaderboard.txt','r') 
    return TextRead 

def SortLeaderboard(LeaderBoard): 
    TextFile = open('Leaderboard.txt', 'w') 
    for items in LeaderBoard: 
     TextFile.write('\n| '+items['Driver']+' | '+str(items['Car'])+' | '+items['Team']+' | '+str(items['Grid'])+' | '+items['Fastest Lap']+' | '+items['Race Time']+' | '+str(items['Points'])+' |') 





Leaderboard = Setup() 
FileSetup() 
TextRead = FileSetup() 
TextFile = open('Leaderboard.txt','w') 
SortLeaderboard(Leaderboard) 
#TextRead = FileSetup() 
str = TextRead.read() 
print str 

根據哪個TextRead = FileSetup()我註釋掉SortLeaderboard或FileSetup都可以。如果我在調用SortLeaderboard之後註釋掉TextRead,則SortLeaderboard將寫入該文件,而FileSetup不會。如果我之後調用它,FileSetup將寫入文件,而Sortleaderboard不會。 問題是隻有一個函數寫入文件。我無法同時寫信給它。

對不起,這真是令人困惑,這是我能想到解釋它的最好方法。如果您需要我以不同的方式解釋某些內容,只需詢問,我會嘗試,

+2

那麼...你究竟想要完成什麼?它看起來像讀取文件和從文件讀取沒有問題。如果你明確地定義了問題,那麼*會顯示你試圖完成的任務。 –

+0

增加了問題所在。如果SortLeaderboard函數寫入它,則FileSetup函數中將沒有任何內容。反之亦然。 –

+1

「安裝」功能的代碼在哪裏?你正在調用'FileSetup()'兩次,並將文件以'r''方式打開,並且你試圖在4個不同的地方打開該文件... –

回答

1

請避免直接撥打.open.close並使用context managers來代替。完成後他們將處理關閉文件對象。

from contextlib import contextmanager 
@contextmanager 
def setup_file(): 
    with open('Leaderboard.txt','w') as writefile: 
     myfile.write('''| Driver |  Car  |  Team  |  Grid  | Fastest Lap | Race Time | Points | 
''') 
    with open('Leaderboard.txt','r') as myread: 
     yield myread 


def SortLeaderboard(LeaderBoard): 
    with open('Leaderboard.txt', 'w') as myfile: 
     for items in LeaderBoard: 
      TextFile.write('\n| '+items['Driver']+' | '+str(items['Car'])+' | '+items['Team']+' | '+str(items['Grid'])+' | '+items['Fastest Lap']+' | '+items['Race Time']+' | '+str(items['Points'])+' |') 


Leaderboard = Setup() 
with setup_file() as TextRead: 
    SortLeaderboard(Leaderboard) 
    str = TextRead.read() 
print str 

在這裏,您實例化你自己的上下文管理setup_file封裝準備使用的文件,清理之後。

上下文管理器是一個帶有yield語句的python生成器。在產量聲明之後,流量控制從發電機傳遞到發電機主體。

在發生器的主體已經執行後,控制流被傳回發生器並且可以完成清理工作。

open默認情況下可以充當上下文管理器,並負責關閉文件對象。