合并2个文件以创建1个文件作为输出

时间:2018-11-26 15:23:07

标签: python loops for-loop if-statement

我有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的信息后停止。脚本似乎没有返回第一个循环以继续该过程。 有什么想法吗?

1 个答案:

答案 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上,然后过滤块列表,仅保留第一行位于我们从第一个文件获得的列表中的那些块。

仅输出第三个块。