2015-10-28 67 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)