2016-03-19 28 views
0

我有一個叫projects.txt文件,其中包含下面的代碼行:的Python加載列表和打印選號

['Apollo', 'Astro', 'Aurora', 'Barcelona'] 

我用下面的Python2代碼加載該文件,並嘗試打印選號但我總是從我的名單越來越只是一個單一的字符:

import random 

projNames = open('projects.txt').read() 
print(random.choice(projNames)) 

結果舉例:一個


但是,如果我將文本文件的內容直接複製到代碼中,它對我來說正常工作。

import random 

projNames = ['Apollo', 'Astro', 'Aurora', 'Barcelona'] 
print(random.choice(projNames)) 

結果舉例:阿波羅

我需要它能夠加載該文件的內容,而不是直接在我.py文件編輯代碼。

我在原始代碼中忽略了什麼?我特別使用Python 2.7.x (最新版本)

+0

你'projects.txt'文件包含一個字符串的內容「[‘阿波羅’,‘天文’,‘極光’,‘巴塞羅那’]」? – kvorobiev

+0

嘗試通過'projNames = eval(projNames)' – ayhan

+0

首先將其轉換爲列表,不,項目文件沒有圍繞整個列表的雙引號。 –

回答

1

你用雙引號替換單引號字符後可以使用json.loads。該代碼將是這樣的:

import random 
import json 

line = open('projects.txt').read().replace("'", '"') # Format JSON 
projNames = json.loads(line) # Load list 
print(random.choice(projNames)) 
+0

令人印象深刻!你能詳細說明一下,或者指出爲什麼它比使用'ast'模塊更安全嗎? –

+1

@DanijelJ,哦,我剛剛讀到'ast.literal_eval'進行了所有必要的安全檢查,因此可以安全使用但是,我個人並不喜歡和相信類似eval的函數調用,如果可能的話我會盡量避免它們。 – max

+1

另外,構建AST樹是一個代價高昂的操作。 e檢查和JSON解決方案比AST一個快三倍 – max

1

這是因爲read方法會將您的文件讀取爲一個大字符串而不是list。您需要解析read命令的輸出(split用逗號可以爲你工作):

>>> my_string.split() 
['Apollo', 'Astro', 'Aurora', 'Barcelona'] 
2

你必須首先分析\ EVAL字符串,使其Python列表:

import ast 
import random 

projNames = ast.literal_eval(open('projects.txt').read()) 
print(random.choice(projNames)) 
+0

這很簡單,並且完美的工作,謝謝,我正在通過'pydoc ast'閱讀以獲得更好的概述。 –