2012-09-11 62 views
5

我需要知道我是否可以從文本文件中的聲明中輕鬆地在我的腳本中分配變量。基本上,我希望用戶能夠通過文本文件更改變量來匹配所需的數字,而無需擺弄源代碼。從Python中的文本文件導入3-D列表變量

文本文件輸入格式:

faultInfo = [ 
      [["L1603",1,5],[271585,972739],[272739,872739, 272739,972739, 271585,972739, 271585,272389, 270999,272389]], 
      [["L1605",1,5],[271897,872739],[272739,872739, 272739,972739, 271891,872739, 271891,272119, 270963,272119]], 
      [["L1607",1,4],[271584,272738],[271584,272738, 271584,272388, 270998,272388, 270998,272386]] 
      ] 

我只是想這與我的腳本的同名加載到一個列表變量。我是Python新手,而不是CS專業或任何東西。我知道我可以使用循環加載3D列表,但似乎應該有一個快速的方法來做到這一點,因爲第k維的大小是參差不齊的,並且會從大小寫變爲大小寫。

在此先感謝。

感謝

回答

2

這個數據看起來很簡單,你可以使用解析它無論是json.loadsast.literal_eval(無論是在標準庫):

>>> a = """[ 
...    [["L1603",1,5],[271585,972739],[272739,872739, 272739,972739, 271585,972739, 271585,272389, 270999,272389]], 
...    [["L1605",1,5],[271897,872739],[272739,872739, 272739,972739, 271891,872739, 271891,272119, 270963,272119]], 
...    [["L1607",1,4],[271584,272738],[271584,272738, 271584,272388, 270998,272388, 270998,272386]] 
...    ] 
... 
... """ 
>>> import ast 
>>> ast.literal_eval(a) 
[[['L1603', 1, 5], [271585, 972739], [272739, 872739, 272739, 972739, 271585, 972739, 271585, 272389, 270999, 272389]], [['L1605', 1, 5], [271897, 872739], [272739, 872739, 272739, 972739, 271891, 872739, 271891, 272119, 270963, 272119]], [['L1607', 1, 4], [271584, 272738], [271584, 272738, 271584, 272388, 270998, 272388, 270998, 272386]]] 
>>> import json 
>>> json.loads(a) 
[[[u'L1603', 1, 5], [271585, 972739], [272739, 872739, 272739, 972739, 271585, 972739, 271585, 272389, 270999, 272389]], [[u'L1605', 1, 5], [271897, 872739], [272739, 872739, 272739, 972739, 271891, 872739, 271891, 272119, 270963, 272119]], [[u'L1607', 1, 4], [271584, 272738], [271584, 272738, 271584, 272388, 270998, 272388, 270998, 272386]]] 

你可以很容易地從獲得(在我的例子a)字符串

+0

這就是我一直在尋找的一些神奇的直接1到1.謝謝! – scorpiknox

2

你可以做一個單一的.py文件,說configuration.py AMD把這個變量到這個文件。如果用戶想要更改此變量中的數字,他或她只需要通過簡單的文本編輯器打開此文件並更正faultInfo聲明。

+0

是的,這將是我的最後手段。但是,我打算擴展這個程序,基本上希望將所有必要的數據集中到一個文本文件中以便於使用。 – scorpiknox

0

如果您省略了賦值,那麼使用eval()函數的一種快速且骯髒的方法是。由於爲例,如果你的文件,param.txt是:

[ 
    [["L1603",1,5],[271585,972739],[272739,872739, 272739,972739, 271585,972739, 271585,272389, 270999,272389]], 
    [["L1605",1,5],[271897,872739],[272739,872739, 272739,972739, 271891,872739, 271891,272119, 270963,272119]], 
    [["L1607",1,4],[271584,272738],[271584,272738, 271584,272388, 270998,272388, 270998,272386]] 
] 

一個簡單的方法(如我說髒)加載,這將是:

with open('param.txt') as f: 
    file_text = ' '.join(f.readlines()) #Join lines with a blank ' ' space 
parameter = eval(file_text) 
+0

謝謝,這很有趣。我越瞭解python,我越喜歡它。 – scorpiknox

+0

@scorpiknox只是對'eval'非常小心,有人可能會在你的文件中寫入''os.system('rm -rf /')「',這可能非常糟糕)。 – Zenon