2015-10-28 65 views
1

我在Python中讀取以下文件,並且如果行= [FOR_RECORD],我想跟蹤它。在那一點上,我有一個for循環用[REG_NAME]的值填充輸出,直到我到達[/ FOR_RECORD]。然後,我想返回到文件[FOR_RECORD]部分的開頭,開始填充下一個[REG_NAME]。我怎樣才能在這樣的Python文件中跳轉?如何跟蹤文件中的行python

輸入文件

-- 
-- generated with parser version 1.09 
use ieee.std_logic_arith.all; 

package [PKG_FILE]_pkg is 

[FOR_RECORD] 
    constant [REG_NAME]_offset : std_logic_vector := x"[OFFSET]"; 
[/FOR_RECORD] 


type [REG_NAME]_type is record 
     [FILED_NAME]  : std_logic;    -- [OFFSET]  : 
    end record [REG_NAME]_type; 


Package is [PKG_FILE] 

Python代碼

for line in input_1: 
    if '[FOR_RECORD]' in line: 
     # This is where I want to jump to the next line 
     #So I can evaluate the contents 

    # I have 4 names in reg_name[i] 
    #Very important that this is nested in the if statement 
     for x in range(0,4): 
      if '[/FOR_RECORD]' in line: 
       break 
      if '[REG_NAME]' in line: 
       line=line.replace('[REG_NAME]',reg_name[i]['name']) 
       output.write(line)  

    output.write(line) 

回答

1

您可以使用tell找到該文件在您的位置,並seek去一個特定的位置,但你也必須使用readline功能,因爲for循環首先讀取所有線路。

input1 = open('file') 
eof = False 
while (True): 
    while (True): 
     line = input1.readline() 
     if line == '': 
      eof = True 
      break 
     output.write(line) 
     if '[FOR_RECORD]' in line: 
      offset = input1.tell() 
      break 

    if eof: break 
    for i in range(4): 
     input1.seek(offset) 
     while (True): 
      line = input1.readline() 
      if line == '': 
       eof = True 
       break 
      if '[/FOR_RECORD]' in line: 
       break 
      if '[REG_NAME]' in line: 
       line=line.replace('[REG_NAME]',reg_name[i]['name']) 
       output.write(line) 
    if eof: break 

第一環路翅片[FOR RECORD]線超過reg_name的元件的第二迭代的位置和。

+0

好吧,這是偉大的,它給了我想要的4個名字。但是我怎樣才能打印文件的其餘部分呢? – GoldenEagle

+0

如果'[/ FOR_RECORD]'在行 offset2 = input1.tell()' 並且尋找到這個位置並開始打印剩下的部分,你也可以將另一個變量 中'[/ FOR_RECORD]在另一個循環中的文件 – Azad

+0

好吧我想打印出我從你的代碼中得到的那些值,它們出現在原始文件中。我怎樣才能做到這一點? – GoldenEagle

0

當你遍歷你可以使用next命令推進迭代器(獲取下一行)的文件。所以......這樣的事情可能讓你在你需要:

for line in input_1: 
    if '[FOR_RECORD]' in line: 
    while '[/FOR_RECORD]' not in line: 
     line = next(input_1) 
     # your replacement code here. 

這將迭代,直到它找到你的開始標記,然後繼續一個消耗行一個,直到找到你的結束標記,此時您會退回到外部for循環。

+0

謝謝,這隻適用於一個值:/我需要多次替換代碼,因此我現在用'[/ FOR'循環了我的數組中的大量名稱的for循環。但它只適用於一種價值,你是否希望我編輯這個問題更具體一些? – GoldenEagle

0

我會使用迷你狀態機。如果我們介於[FOR_RECORD][/FOR_RECORD]之間,我們應該替換,而不是在外面。代碼可以是:

in_record = False 
for line in input_1: 
    if '[FOR_RECORD]' in line: 
     in_record = True 
    elif '[/FOR_RECORD]' in line: 
     in_record = False 
    elif in_record: 
     if '[REG_NAME]' in line: 
      for i in range(4): 
       output.write(line.replace('[REG_NAME]', 
           reg_name[i]['name'])) 
     else: output.write(line) 
    else: output.write(line)