我有2个看起来像的文件: 首先:
port2
port4
port10
etc.
第二:
port1
some stuff
about the port
I do not need
!
port2
some stuff
about the port
I really need
!
some generic stuff which is completely useless
!
port3
some stuff
about the port
I do not need
!
port4
some stuff
about the port
I really need
!
etc
现在,我要创建一个循环,对于第一个文档中的每一行,我们将遍历第二个文档,并创建一个包含我需要的所有数据的新文件(“ port2”直到“!”, “ port4”,直到“!”等)
到目前为止,我得到的是:
def access():
with open ("D:/portlist.txt") as f1, open ("D:/config.txt") as f2:
match = False
for line in f1:
newConfig = open ("D:/portconfig.test.txt", "a")
interface = line
for line2 in f2:
if re.match(interface, line2):
newConfig.write(line2)
print(line2)
match = True
elif re.match("!", line2):
match = False
elif match:
newConfig.write(line2)
newConfig.close()
access()
问题是脚本在返回所有有关port2的信息后停止。脚本似乎没有返回第一个循环以继续该过程。 有什么想法吗?
答案 0 :(得分:2)
您的问题源于以下事实:一旦读取完文件,它就不会自动返回到第一点。由于您要遍历第二个文件以查找每个值,因此您要么需要通过f2.seek(0)
进行查找,要么只需读取一次文件在内存中的内容,然后在其上循环即可。
关于您的代码,一种快速(又肮脏)的解决方案利用了您拥有块分隔符(!
)的事实:
with open(...) as f1, open(...) as f2:
section_names_to_keep = f1.read().splitlines()
config_content = f2.read()
config_blocks = config_content.split('!\n')
blocks_to_keep = [ bl for bl in config_blocks if bl.splitlines()[0] in section_names_t_keep ]
with open('your_output_file.txt', 'a') as fp:
fp.write('!\n'.join(blocks_to_keep))
注意:您对预期的输出格式不太清楚,因此我认为它看起来应该像config.txt
。我一次写入输出文件(首先我用'!\n'.join(blocks_to_keep)
在内存中生成输出内容,然后将其写出)。如果(我假设)您的数据很小,那么这将不是问题。如果不是这种情况,只需循环blocks_to_keep
并逐块写出。
在第一步中,我只是加载两个文件的内容。因为对于第一个文件,我们对每一行都感兴趣,所以我已经将其分割成几行。
在第二个块中,将配置拆分到块分隔符!\n
上,然后过滤块列表,仅保留第一行位于我们从第一个文件获得的列表中的那些块。
仅输出第三个块。