繁体   English   中英

如何跟踪文件python中的行

[英]How to keep track of lines in a file python

我正在读取的python中有以下文件,如果行= [FOR_RECORD],我想跟踪。 在那一点上,我有一个for循环,使用[REG_NAME]的值填充输出,直到到达[/ FOR_RECORD]。 然后,我想回到文件的[FOR_RECORD]部分的开头,开始使用下一个[REG_NAME]进行填充。 我如何在这样的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)

您可以使用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的元素。

当您遍历文件时,可以使用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.

这将反复进行,直到找到您的begin标记,然后继续逐行消耗一行,直到找到您的close标记为止,此时您将回到外部for循环。

我会使用一个迷你状态机。 如果我们在[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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM