【问题标题】:Combining 2 files to create 1 file as output合并 2 个文件以创建 1 个文件作为输出
【发布时间】:2018-11-26 15:23:07
【问题描述】:

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

【问题讨论】:

标签: python loops for-loop if-statement


【解决方案1】:

您的问题源于这样一个事实,即一旦文件被读取到最后,它不会自动返回到第一点。由于您要为搜索的每个值循环遍历第二个文件,因此您要么需要通过 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 上,然后过滤块列表,仅保留第一行在我们从第一个文件获得的列表中的那些块。

第三个块只是输出。

【讨论】:

  • 谢谢,但恐怕这会给我一个“IndexError:列表索引超出范围”。虽然我理解错误,但我找不到问题...
  • 我猜它来自[0] 之后的splitlines(),您的配置中是否有可能有一个空块?不能用问题中给出的信息说更多
  • 我也是这么认为的。 f1 只是总结了不同行上的每个端口(例如端口 1、端口 5、端口 7)。 f2 以“begin”开头 en 以“end”结尾。在数据块之间有一个“!”,或多个!(这可能是原因吗?)。根本没有白线。
  • 多个 ! 是问题所在。我将重写一些代码来生成 txt 以避免这些。谢谢!
  • 是的,这就是我所说的空块:)
猜你喜欢
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2021-12-02
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多