2013-05-28 61 views
-5

好的, 可以說我有一個文件中的變量名稱列表,我想將它們存儲在一個列表中。 我可以製作一個while循環,然後將它們附加到列表中,但是它們作爲字符串保存在列表中。如何將其改爲一組變量名稱。保存readline()作爲元素不是字符串

list = [] 
f = open("text.txt",r) 
f.readline() 
while line != "": 
    list.append(line) 
    f.readline() 

我希望列表成爲變量名稱列表,而不是字符串列表。 謝謝

+4

什麼是「變量名」如果不是字符串?你想查找名稱與每個字符串匹配的全局變量,並將_those_存儲在列表中嗎? (如果是這樣,爲什麼呢?這是一件非常奇怪的事情,這是可行的,我可以解釋,但如果你描述你的目標是什麼,我可以給你一個更好的方法來實現它。) – abarnert

+3

偏題:避免使用'list'作爲變量名稱。 –

回答

5

首先,變量名稱只是的一個字符串。所以,你已經把變量名放在一個列表中。

如果您想查找由每個字符串命名的全局變量,並將這些變量放入列表中,那麼您無法這樣做,因爲您無法將變量放入列表中。變量在Python中不是真實的東西,它們只是(內置的,全局的,本地的或合格的)值的名稱;這是這是真實的東西。

但是,如果你想查找由每個字符串命名的全局變量,並將每個變量的值放入一個列表中......這很容易。改變這一行:

list.append(line) 

...這樣的:

list.append(globals()[line]) 

然而,你的代碼有許多意味着它不會實際工作的其他問題。您已使用變量r而不是字符串'r'作爲您的文件模式,該模式(除非r碰巧巧妙地保存有效模式字符串)將失敗。你也從來沒有給line分配任何東西,只是扔掉每個readline的結果,這意味着你將得到一個試圖訪問它的異常(或一個無限循環或立即退出的循環)。同時,大多數逐行讀取文件的方法(包括f.readline())會將換行符保留在字符串的末尾,而且很可能不會有名稱以換行符結尾的變量。

雖然我們在這,但這不是pythonic代碼。你永遠不應該命名變量list,你應該總是關閉你的文件,空字符串是錯誤的,所以你不需要比較,你應該使用for循環遍歷集合。

所以:

values = [] 
with open("text.txt") as f: 
    for line in f: 
     values.append(globals()[line.rstrip('\n')]) 

或者更簡單地說,使用列表理解:

with open("text.txt") as f: 
    values = [globals()[line.rstrip('\n')] for line in f] 

最後,這整個的設計目標聞起來很奇怪,我敢打賭這不是完成你想要完成的任何事情的正確方法。

+0

+1對於非常好的解釋,儘管它不完全清楚OP正在嘗試做什麼 –

+1

@MarkkuK:嗯,我的猜測可能會消失,在這種情況下,這完全是一個錯誤的解釋,但......但讓我們保持手指交叉。 – abarnert

+1

你的第一個代碼片段(OP的複製和粘貼)有一個相當明顯的錯誤:你從來沒有在'line'中實際存儲f.readline()的值。另外,'readline'方法會留下尾隨的換行符,因此您仍然需要執行'.rstrip('\ n')'。 – jwodder

相關問題