2016-01-13 54 views
0

我試圖製作一個stats.txt文件,我可以在其中存儲winsdrawslosses。到目前爲止,我能夠檢索這些值並在程序運行時對其進行修改的唯一方法是,使用.readlines()打開它們,然後將它們作爲列表中的整數(如下所示)分配給一個變量。將列表中的整數轉換爲要寫入文本文件的字符串,並稍後檢索

我的問題是,我似乎無法找到一種方式將它們寫回到文本文件,因爲它們是以列表形式。任何人都可以將我指向正確的方向嗎?

文本文件的格式如下:

0\n 
0\n 
0\n 

閒來無事寫在它的其他的三個0的,其次是enter.

我的代碼如下:

stats = open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt","r") 
lines = stats.readlines() 
wins = list(int(val) for val in lines[0].split()) 
draws = list(int(val) for val in lines[1].split()) 
losses = list(int(val) for val in lines[2].split()) 

如果我指定這些沒有list,輸出變成:generator object <genexpr> at 0x0000011CEF216CA8打印時,我不能用+1修改值。

if result == 0: 
    print("Draw!") 
    draws = [x + 1 for x in draws] 

elif result == 1: 
    print(ai_var+" Wins!") 
    losses = [x + 1 for x in losses] 

elif result == 2: 
    print(ai_var+" Wins!") 
    losses = [x + 1 for x in losses] 

elif result == 3: 
    print(user_var+" Wins!") 
    wins = [x + 1 for x in wins] 

else: 
    print(user_var+" Wins!") 
    wins = [x + 1 for x in wins] 

print(wins) 
print(draws) 
print(losses) 

stats.close 
with open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt","w") as f: 
    f.write(wins) 
    f.write(draws) 
    f.write(losses) 

我的結果是:

TypeError: write() argument must be str, not list 

我不能得到這個轉換爲字符串,並且它會以相同的格式進行檢索,因爲我需要它是這樣一種方式寫在每次程序運行時都能夠處理我。

我寧願只是將文本文件中的值作爲整數導入,修改它們,然後將它們寫成整數,但是我還沒有找到辦法做到這一點。我知道必須有更好的方法來做到這一點。

+0

注:'[INT(VAL)的VAL在行[0] .split()] '不需要'list'。 – Evert

+0

'stats.close'不關閉文件,你需要調用'stats.close()' –

+0

或者使用'with'語句來讀取。你只對文件執行'readlines()',之後你不需要這個文件並關閉它。 – Evert

回答

0
  1. 你應該在這種情況下使用str.strip()代替str.split()str.split()將字符串拆分空字母(空格,換行符,製表符等)並返回一個列表。

    但是,它看起來像你不需要在這裏列表,只是想刪除那\n,然後,你可以使用str.strip()。其中刪除字符串之前和之後的空字母

    演示:

    >>> s = '0\n' 
    >>> s 
    '0\n' 
    >>> s.strip() 
    '0' 
    >>> s.split() 
    ['0'] 
    >>> int(s.strip()) 
    0 
    
  2. 然後,它是一個int對象。所以你可以完全放棄這些列表理解並使用object += 1

    但是,您可以使用str()函數將它寫回到文件時將其轉換爲字符串對象。

    記得還添加了+\n,如果你不想讓他們都在同一個行:

    with open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt", "r") as f: 
        lines = f.readlines() 
        wins = int(lines[0].strip()) 
        draws = int(lines[1].strip()) 
        losses = int(lines[2].strip()) 
    
    if result == 0: 
        print("Draw!") 
        draws += 1 
    
    elif result in [1, 2]: 
        print(ai_var+" Wins!") 
        losses += 1 
    
    else: 
        print(user_var+" Wins!") 
        wins += 1 
    
    with open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt","w") as f: 
        f.write(str(wins)+'\n') 
        f.write(str(draws)+'\n') 
        f.write(str(losses)+'\n') 
    
+0

這看起來幾乎完美!當我運行這個,雖然,我得到這個錯誤:wins + = 1 TypeError:不能將int對象隱式轉換爲str – Jawshbawx

+0

@Jawshbawx:好的,我編輯了我的答案。看看它。 –

+0

完美!非常感謝,這讓人感到沮喪。 – Jawshbawx

0

你想用writelines(),而不是write()寫一個迭代的對象(如字符串列表),類似於獲得一個字符串的方法是如何read()和方法得到的字符串列表是readlines()

相關問題