2016-01-21 18 views
2

我有一個計算分數'LevelScore'的程序,我想打開UserFile'UserScoreFile'並檢查當前保存的用戶分數並且如果LevelScore> CurrentScore將表示文本文件中的該級別的前幾個字符覆蓋到LevelScore。想用Python中的新字符覆蓋文本文件中特定行上的特定字符

Text文件中的每一行代表0-7級別,每行格式爲「T 000」,T表示級別未鎖定,000表示當前分數(分數可以爲0-100)「 lev「是一個從0到7的變量,表示用戶所在的級別。

UserFileR = open("UserScoreFile.txt","r") 
    UserFileLines = UserFileR.readlines() 
    UserLevelLine = UserFileLines[lev] 
    UserLevelScore = UserLevelLine[2:5] 

if LevelScore > UserLevelScore: 
    UserFileWR = open("UserScoreFile.txt","r+") 
    #This is where i dont know what to do... 
+0

嗨盧克!歡迎來到黑暗的一面...爲什麼你不在課程中::( –

+0

['fileinput'模塊](https://docs.python.org/3/library/fileinput.html)會透明地做到這一點。但你確定你想在每次分數改變時打開,讀取,更改和寫回整個文件嗎?在程序啓動時將文件讀入列表不是更好,跟蹤內存中的變化並寫回在退出時列出文件? –

+0

@TimPietzcker我知道盧克在現實生活中,並幫助他完成他的項目,他需要在執行他的程序時多次更改文件內容(他正在製作一個觸摸式程序) –

回答

1

這裏的解決方案我和盧克想出了協作:

UserFileRW = open("UserScoreFile.txt","r+") 
UserFileLines = UserFileRW.readlines() 
UserLevelLine = UserFileLines[lev] 
UserLevelScore = int(UserLevelLine[2:]) 
UserFileRW.close() 

if LevelScore > UserLevelScore: 
    UserFileWR = open("UserScoreFile.txt","w+") 
    UserFileLines[lev] = "T " + str(LevelScore) + "\n" 
    UserFileRW.writelines(UserFileLines) 
    UserFileRW.close() 

謝謝Jotto和Tim Pietzcker你的貢獻。

+0

對你有好處,我忘了用'w +'打開會重啓如果存在就移動。除了writelines在列表元素處添加'\ n'。 –

+0

@jotto在經過一些調試之後,我們將其基於您的原始解決方案,謝謝。 –

2

這應該讓你開始。

UserFileRW = open("UserScoreFile.txt","r+") 
UserFileLines = UserFileR.readlines() 
UserLevelLine = UserFileLines[lev] 
UserLevelScore = int(UserLevelLine[2:5]) 

if int(LevelScore) > UserLevelScore: 
    UserFileRW.truncate() 
    UserFileLines[lev] = "some tex" + str(LevelScore) # there is something before score, but I don't know what 
    UserFileRW.write(''.join(UserFileLines)) 
    UserFileRW.close() 

不幸的是,這是不可能改變文件中間的東西。所以你必須解析所有這些,進行修改,然後重新寫入。

+1

代表Luke Gibson(他坐在我旁邊),'UserFileRW.truncate()'不會刪除文件的前一個內容,並且在保存的文件的每一行之間還有一個額外的行,任何想法? –

0

使用fileinput module,你可以這樣做:

import fileinput 
with fileinput.input(files=["test.txt"], inplace=True) as f: 
    for line in f: 
     if fileinput.lineno() == lev+1:  # line numbers start at 1, not 0 
      UserLevelScore = int(line[2:5]) # assuming LevelScore is an int 
      if LevelScore > UserLevelScore: 
       line = "{}{:0>3}".format(line[:2], LevelScore) 
       # right-justify LevelScore with leading zeroes 
     print(line, end="") # Output is redirected to the current line of the file 
相關問題