2014-07-07 84 views
0

我有一個包含按以下格式幾行文本文件中的字符串:研究與Python中的變量數

ELEMENT=  1 PLY= 1 
----------------------- 
Code 1425          
    GP= 1 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00 
    GP= 2 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00 
    GP= 3 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00 
    GP= 4 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00 

ELEMENT後的數字變爲1到60我的第一個目標是讀取此文本文件並停止出現字ELEMENT = 1ELEMENT = 60

我的測試腳本讀取第一個出現的ELEMENT。我現在想要通過ELEMENT這60個事件,所以我試圖在ELEMENT之後實現一個變量,在這個例子中,我將它初始化爲2,看它是否會起作用,並且你可以猜到它不會(請參閱下面的示例代碼)。

elem= 2 
lines = open("myfile.txt", "r").readlines() 

for line in lines: 
if re.search(r"ELEMENT=  %i" (line, elem)): 
    words = line.split() 

    energy = float(words[1]) 

    print "%f" % energy 
    break 

我收到以下錯誤代碼:

File "recup.py", line 42, in <module> 
if re.search(r"ELEMENT=  %i" (line, elem)): 
TypeError: 'str' object is not callable 

我那麼問題是,我將如何實現一個可變進我的搜索?

+1

「閱讀這個文本文件,並停止每一個單詞」ELEMENT = 1「到」ELEMENT = 60「」< - 這是什麼意思?我試着三次閱讀你的問題,並且仍然對你想要做的事感到困惑。 – timgeb

+2

_「...看它是否會起作用,因爲你可以猜測它不會」_「。那麼,它崩潰了,還是什麼? – Kevin

+0

我添加了返回的錯誤代碼。實際上,我的目標是從大文本文件中提取我的帖子中顯示的60個數據塊。我希望這更清楚。 –

回答

0

只是遍歷塊:

import re 

txt='''\ 
ELEMENT=  1 PLY= 1 
----------------------- 
Code 1425          
    GP= 1 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00 
    GP= 2 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00 
    GP= 3 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00 
    GP= 4 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00 

ELEMENT=  2 PLY= 22 
----------------------- 
Code 1426         
    GP= 5 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00 
    GP= 6 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00 
    GP= 7 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00 
    GP= 8 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00  
    ''' 

for i, m in enumerate(re.finditer(r'^ELEMENT=\s+(\d+.*?)(?=^ELEMENT|\Z)', txt, re.M | re.S)): 
    print 'Group {}===:\n{}'.format(i, m.group(1)) 

這將找到線,說明元素,要麼下一個塊或文件的結尾結束的塊。然後解析發現的塊到什麼。

打印:

Group 0===: 
1 PLY= 1 
----------------------- 
Code 1425          
    GP= 1 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00 
    GP= 2 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00 
    GP= 3 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00 
    GP= 4 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00 


Group 1===: 
2 PLY= 22 
----------------------- 
Code 1426         
    GP= 5 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00 
    GP= 6 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00 
    GP= 7 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00 
    GP= 8 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00 
+0

感謝您的回答。當我嘗試運行您的代碼時,出現以下錯誤:'File'./stackover.py',第25行,在 print'Group {} ===:\ n {}'。format(i,m。組(1)) ValueError:格式中的零長度字段名稱我做了什麼錯誤? –

+0

你有Python 2.6嗎?如果是這樣,你需要做'Group {0} ===:\ n {1}'。format(i,m.group(1))'注意花括號中的0和1。或升級到2.7 - 已經出來4年了... – dawg

+0

是的我有python 2.6。但是我們在工作中使用虛擬機,而且我們有一箇舊版本的Ubuntu,從我讀的內容來看,我不應該升級我的Python版本。謝謝你的答案。 –

0

我不是很確定你想要做什麼,但如果你想測試其中ELEMENT你在重複,這將是一個更好的辦法:

elem= 2 
lines = open("myfile.txt", "r").readlines() 

for line in lines: 
    if re.match(r"ELEMENT=",line): 
    words = line.split() 
    if int(words[1]) == elem: 
     # Do whatever you're trying to do. 
0

如果你總是搜索符合「元素」開始有解決這個簡單的方法:

lines = open("myfile.txt", "r").readlines() 
for line in lines: 
    if line.startswith("ELEMENT"): 
    words = line.split() 
    print "ELEMENT : " + words[1] + ", PLY : " + words[3] 

使用此選項,每次找到「ELEMENT」行時都會打印行內容。您可以使用相同的技巧輕鬆提取「CODE」和「GP」行內容;)。

0

一些簡單的更改:

elem= 2 
lines = open("myfile.txt", "r").readlines() 

for line in lines: 
    words = line.split() 
    if words[0].startswith('ELEMENT'): 
     energy = int(words[1]) 
     if energy == elem: 
      break 

print "%f" % energy 
break 

不要嘗試比較==漂浮 - 這塞爾頓證明以及

0

如果我正確理解你的問題,你可以在「工廠」可變進搜索是這樣的:

if re.search(r"ELEMENT=  {}".format(elem), line):