2014-10-27 46 views
0

我已經制作了列表來存儲給定學生的分數數據。該名單被稱爲「class1」,每名學生都有一個名字,然後是3分。我可以對這個文件列表罰款,可以寫信給其顯示出正確格式的數據文件:將列表清單讀入Python

class1=[["Tom",7,2,1],["Jo",8,0,0],["Adelphe",9,0,0]] 

當寫這個樣子的,我很高興有:

['Tom', 7, 2, 1] 
['Jo', 8, 0, 0] 
['Adelphe', 9, 0, 0] 

問題是當我嘗試讀取相同的列表。每個子列表都以字符串形式讀取。我似乎無法改變這一點。

下面是代碼:

class1 = [line.strip() for line in open("data2.txt", 'r')] 

這是列表的外觀,當念想,你可以看到有大約每個子列表撇號,這意味着他們Class1的列表中的字符串:

["['Tom', 7, 2, 1]", "['Jo', 8, 0, 0]", "['Adelphe', 9, 0, 0]"] 

任何人都可以幫助我,我做了很多搜索,但找不到任何人有同樣的問題。

謝謝,湯姆

+0

你的意思是'split',不'strip'。 – jonrsharpe 2014-10-27 11:32:25

+3

爲什麼不使用JSON或CSV而不是發明自己的格式? – geoffspear 2014-10-27 11:33:15

+0

嘗試使用'eval(string)'。如果字符串表示一個列表,它應該成爲一個python列表對象。即'class1 = [eval(line.strip())for line in open(「data2.txt」,'r')]' – SomethingSomething 2014-10-27 11:33:21

回答

1
>>> import ast 
>>> with open('/path/to/data2.txt', 'r') as classes: 
     lines = [ast.literal_eval(line.strip()) for line in classes] 

>>> print lines 
[['Tom', 7, 2, 1], ['Jo', 8, 0, 0], ['Adelphe', 9, 0, 0]] 
+0

嗨,eval工作。使用什麼好處:ast.literal_eval?請原諒我的無知! – 2014-10-27 11:55:57

+0

@TomSmith'ast.literal_eval'可防止任意代碼執行。 – 2014-10-27 12:03:30

+0

@TomSmith'''eval'''會評估**任何**有效的表達式,這使得未知的數據可能會損害您的計算機,例如創建一個巨大的字符串並耗盡您的處理器時間和/或內存。除非你100%確信你的數據不要使用''''eval''',''ast.literal_eval''是安全的,因爲它限制了表達式的類型。 – wwii 2014-10-27 12:05:53