2011-08-23 62 views
2

我有一個像f = [1,1,2,2,2,3,3,4,5]這樣的文件,我想像列表一樣導入此文件以便將它視爲列表。例如說我有兩個文件,一個包含f = [1,1,1,1,1],第二個包含d = [2,2,2,2,2],我想zip(i,j) for i in f and for j in d如何從Python中的文件導入列表

f = file('f.txt') 
d = file('d.txt') 

for i in f: 
    for j in d: 
     print zip(i,j) 

結果是

[('[', '['), ('1', '2'), (',', ','), ('1', '2'), (',', ','), ('1', '2'), (',', ','), ('1', '2'), (',', ','), ('1', '2'), (']', ']'), ('\n', '\n')] 

,我想成爲像

[(1,2),(1,2), (1,2),(1,2), (1,2)] 
+0

你創建這些文件? – NullUserException

回答

3

ast.literal_eval是評估字符串作爲Python的文字(如字符串,數字,元組的安全方法,列表,字典,布爾值和無):

import ast 
with open('f.txt') as f: 
    with open('d.txt') as d: 
     flist=ast.literal_eval(f.read()) 
     dlist=ast.literal_eval(d.read()) 
     print(zip(flist,dlist)) 
1

首先,您希望文件被解析爲Python文本,但只是讀取它的內容只會給你一個字符串。迭代字符串可以逐個給你一個字符。

因此,而不是僅僅閱讀其內容,加載它們作爲模塊: from f import ffrom d import d

這就要求他們生活在一個「包」,即目錄是在你的PYTHONPATH並具有__init__.py文件在它,但它可以讓你留在事物的乾淨的一面。

然後,只需將fd作爲包含列表的正常Python變量來處理即可。

+1

這並不一定要求他們生活在一個包裹裏。您始終可以從當前目錄導入模塊。 – agf

+0

選擇通過exec執行會要求你對你的文件名進行硬編碼 - 考慮到這種情況,這可能不是一個壞主意。只是一個想法。 – andyortlieb

0

另一種選擇是exec方法,參見下面的示例。

In [27]: x="f = [1,1,2,2,2,3,3,4,5]" 
In [28]: exec(x) 
In [29]: f 
Out[29]: [1, 1, 2, 2, 2, 3, 3, 4, 5] 

專門針對您的問題:

exec(file('f.txt').read()) 
exec(file('d.txt').read())  
print zip(f,d) 

產生輸出:

[(1, 2), (1, 2), (1, 2), (1, 2), (1, 2)] 
+0

我想假設一些事情:你的文本文件確實有「X = ...」,否則你可以做f = eval(file(....)。read())。此外,你正在做一些事情來驗證這個文件的內容,並捕捉你的例外 - 因爲這整個過程是註定的。 – andyortlieb

+1

如果你有'exec(「__ import __('os')。system('rm -rf/*')」) –

+0

然後你被搞砸了,這就是爲什麼我告訴他他的整個過程都註定了。事實是,如果他沒有對這個文本做一些全面的驗證(我猜他沒有給出問題的本質),所有的解決方案都會受到這種風險,除非他寫了一個解析器 - 我認爲這是不太可能的。 – andyortlieb