2014-02-06 109 views
2

我有一個製表符分隔的電影和演員文本文件。該項目是按以下格式:將部分文本文件轉換爲列表

The Shawshank Redemption ["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"] 

The Dark Knight ["Christian Bale", "Heath Ledger", "Aaron Eckhart", "Michael Caine"] 

有一個簡單的辦法有蟒蛇對待演員「名單」以Python列表的數據結構,而不是[]字符的字符串?我試圖編寫代碼來分割從[字符開始的字符串,使用.strip().rstrip()去除[]",然後使用.split(' ,')從剩餘字符串中列出一個列表。但是這並沒有返回我想要的結果。

回答

2

使用ast.literal_evalsafer版本的python的eval()函數,它接受一個字符串輸入並將其視爲python代碼。假設總有一個製表位,您可以用標籤分裂'\t'只計算第二個元素:

import ast 
for line in f.readlines(): 
    temp_list = ast.literal_eval(line.split('/t')[1]) 
    # do something 

只是一個故障,使用您的第一線爲例:

>>> first_line = "The Shawshank Redemption ["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"]" 
>>> split_line = first_line.split('/t') 
>>> split_line 
['The Shawshank Redemption', '["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"]'] 
>>> best_list_ever = ast.literal_eval(split_line[1]) 
>>> best_list_ever 
["Tim Robbins", "Morgan Freeman", "Bob Gunton", "William Sadler"] 
+0

我不熟悉的eval()函數,爲什麼這更安全? – Mike

+0

@Mike查看鏈接。簡而言之,'eval'將會評估任何東西,包括os.system('rm -rf /')(不要這樣做),它會逐字刪除所有文件。當然,在你的計算機上本地保存的一個小python腳本中,發生這種情況的機會並不多,但無論如何,使用'literal_eval'是一種很好的編程習慣。兩者之間的唯一區別是'literal_eval'只會評估有效的Python數據結構。 – jayelm

+0

感謝您的澄清,閱讀完這些文檔後,它非常有意義。此外,我的新默認列表變量已正式成爲「best_list_ever」 – Mike