2014-11-01 107 views
0

我目前正在爲我的學校工作制定一個計劃,要求用戶3套10個隨機生成的問題,然後根據他們所屬的類別,將學生結果存儲在三個文本文件之一中。然後程序應該能夠加載文本文件中的所有數據,以便當下一位學生參加測驗時,其結果會被附加到其餘部分。它存儲在名爲「class1」,「class2」或「class3」的列表中,具體取決於用戶所處的類別。數據可以按不同的方式排序。在這篇文章中,我們將假設用戶處於1級。如何將文件中的文本轉換爲Python中的列表?

該程序會跟蹤用戶名,最高分,平均分和他們在測驗中的三次嘗試並將其存儲到「class1」列表中。以下是「class1」列表。

[('Albert', 6, 2, [6, 0, 0]), ('Bob', 6, 2.33, [6, 1, 0]), ('Cameron', 5, 4, [5, 2, 5])]. 

如果程序從未運行過,程序將簡單地創建一個名爲「Class 1 Data.txt」的新文本文件。如果該文件已經存在,然而,此以下的代碼段上運行:

f = open("C:/Users/Custom/Desktop/Class " + str(classNumber) + " Data.txt", "r") 
lines = f.readlines() 
oldData = lines[3] 

變量「OLDDATA」現在只需含有「[(‘阿爾伯特’,6,2,[6,0的長字符串,0])...「。現在讓我們假設該程序已關閉,然後由另一個名爲Zara的學生加載,然後他接受測驗。由於「舊數據」只是一個字符串,而不是一個列表,當我嘗試添加回列表中的「1類」,這是發生了什麼:

[('Zara', 9, 6, [3, 9, 6]), "[('Albert', 6, 2, [6, 0, 0]), ('Bob', 6, 2.33, [6, 1, 0]), ('Cameron', 5, 4, [5, 2, 5])]\n"] 

我怎麼會去試圖從加載文本文件,然後將其存儲爲列表?我嘗試過使用各種方法,但是他們都沒有工作。任何幫助將不勝感激。

+0

發佈你試過的東西 – 2014-11-01 23:50:07

+0

我嘗試過使用.split()來分割用戶名,最高分,平均分和他們的嘗試,但是它只是導致了這個結果:Old Data List:[「[('Albert ',','6','2','[6,','0,','0])]']。我也嘗試將「class1」轉換爲一個字符串,但這也不起作用。 – Monkeymad358 2014-11-01 23:53:58

回答

0

看起來好像您剛剛將數據的文本表示(在Python中)複製並粘貼到文本文件中,現在您希望獲取該文本並將其從文本轉換回Python數據結構。我認爲這是一個過度複雜的做法。解析器和涉及語法分析的語法相當複雜,對您來說很難重現。另外,我不認爲這是你寶貴的時間。

這使得你只有兩個選擇:

  1. 如果你真的想你的序列化的python類型的磁盤,我會強烈建議嘗試使用pickle庫。這有點複雜,但是一旦你掌握了它,你就應該能夠醃製和醃製完全任意複雜的對象,而不是試圖從普通的舊文本中解析它們。

  2. 如果你不這樣做,你應該找到一個更好,更可預測,更容易解析的方式來保存數據到文本。

  3. 在你的程序本身中,你應該創建類來更容易地封裝你的數據 - 你有一個字符串和整數元組列表和整數列表。在沒有任何面向對象的結構的情況下走過一點點。

例如,如果你使用的是不是捆綁的方式Python類型不同的文字表述看:

name:Zara highscore:9 averagescore:6 attempt1:3 attempt2:9 attempt3:6 
name:Albert highscore:6 averagescore:2 attempt1:6 attempt2:0 attempt3:0 

或者,如果你使用XML,你可以將文檔保存的東西像這樣:

<users> 
    <user name="yrName" highscore="yrScore" averagescore="yrAverage" 
      attempt1="1" attempt2="2" attempt3="3">  
    </user> 
    <user> 
     ... 
</users> 

而且你可以使用xml.etree.ElementTree通過節點走,並挑選出你需要的每一條信息。

我猜這個問題最大的問題不在於爲什麼要存儲數據的方式你是爲什麼你首先要存儲很多數據。 40%的數據 - 所有高分和平均分數 - 根本沒有理由被存儲。如果你有三次嘗試的機會,這些數字是微不足道的,並且創造如此之多,對於你來說,比只使用(1 + 2 + 3)/ 3或者min([1,2,3])更多的工作。

+0

我想我將不得不做第二種選擇,因爲試圖做我現在正在做的事情要比我第一次想到的要複雜得多。我目前只學習了Python的基本知識,所以我沒有學習任何東西,比如XML。我可能會做的是將每條信息存儲在文本文件的單獨一行上,無論如何,我認爲這些信息看起來更整齊一些,只是使用readlines()將這些行附加到變量,然後將其附加到列表中「 class1" 的。感謝您爲任何有類似問題的人發佈解決方案。 – Monkeymad358 2014-11-02 00:14:31

+0

實際上,在閱讀了關於我的數據不需要存儲40%的編輯之後,我可以只用一個列表,只有用戶最後三次嘗試,然後只在打印到文本文件時才計算它。感謝您指出了這一點。 – Monkeymad358 2014-11-02 00:20:49

+0

@ Monkeymad358這應該讓你的生活變得更輕鬆。請記住,特別是在處理以文本文件存儲數據時,請儘可能簡單。 – furkle 2014-11-02 01:41:34

相關問題