[英]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.