将附加信息的数据附加到文件

时间:2016-08-26 16:52:23

标签: python

我有一个包含数千行代码的文本文件,我想按如下方式替换某些元素:

file1中的文字:

serverfarm host foobar2:443
  failaction reassign
  probe tcp111-probe
  rserver foobar1 443
  rserver foobar2 443

包含我想要附加到原始文件文本(file2)的附加信息的文本:

rserver host foobar1
  ip address 1.1.1.1
  inservice
rserver host foobar2
  ip address 1.1.1.2
  inservice

因此我们可以看到在原始文件中rserver行没有捕获IP地址,但我在另一个文件中有此信息。

在:

rserver foobar1 443

之后(所需的输出)

rserver foobar1 443< ---保留原始文字

rserver host foobar1< ---应在原始文本

下添加以下两行
ip address 1.1.1.1

inservice

原始文本字符串"rserver foobar1 443"(删除第3个文本块)与替换文本"rserver host foobar1"的第一行之间存在直接映射(删除第2个文本块=主机)。

是否可以使用python字典或类似方法执行此操作?如果有人能告诉我如何在Python中执行此操作,我会很感激,然后我会在执行类似的任务时使用这种方法。

3 个答案:

答案 0 :(得分:1)

我们的想法是编写一个自定义解析器/翻译器,如下所示:

replacements = {}
with open('file2.txt') as f:
    for l in f:
        l = l.strip()
        if l.startswith('rserver'):
            server_header = l
            server = l.split()
            server_name = server[2]
        elif 'ip address' in l:
            ip_address = l
        elif 'service' in l:
            service = l
            replacements[server_name] = (server_header, ip_address, service)

with open('file1.txt') as f, open('out.txt', 'w') as out:
    for l in f:
        l = l.rstrip()
        if 'rserver' in l:
            server = l.split()
            server_name = server[1]
            out.write(l + '\n')
            out.write('  ' + replacements[server_name][0] + '\n')
            out.write('    ' + replacements[server_name][1] + '\n')
            out.write('    ' + replacements[server_name][2] + '\n')                
        else:
            out.write(l + '\n')

输出 (out.txt)

serverfarm host foobar2:443
  failaction reassign
  probe tcp111-probe
  rserver foobar1 443
  rserver host foobar1
    ip address 1.1.1.1
    inservice
  rserver foobar2 443
  rserver host foobar2
    ip address 1.1.1.2
    inservice

答案 1 :(得分:1)

是的,您可以使用字典或defaultdict映射第二个文件中的服务器名称及其详细信息列表(IP和服务状态),并在写入新文件时插入这些详细信息:

from collections import defaultdict
import re

d = defaultdict(list)
with open('file1.txt') as f1, open('file2.txt') as f2, open('output.txt', 'w') as f3:
    for line in f2:
        if 'host' in line:
            key = line.strip().replace('host ', '')
        d[key].append('  ' + line) # match indentation in file1 with leading spaces

    for line in f1:
        f3.write(line if '\n' in line else line+'\n')
        if 'rserver' in line:
            f3.writelines(d[re.sub(r'\s\d+', '', line.strip())])

output.txt的

serverfarm host foobar2:443
  failaction reassign
  probe tcp111-probe
  rserver foobar1 443
  rserver host foobar1
    ip address 1.1.1.1
    inservice
  rserver foobar2 443
  rserver host foobar2
    ip address 1.1.1.2
    inservice

答案 2 :(得分:0)

如果您正在运行Linux发行版,那么您可以使用awk命令并使用grep管道。

如果你想要一个python的解决方案,那么复杂性将是O(n.m),其中n是第一个文件中的行数,m是第二个文件中的行数。

python中的算法:

open a new file, file3
file1 = f.open(path to file 1)
n = number of lines in file1
file2 = f.open(path to file 2)
m = number of lines in file 2
for i in range(n):
   r = readline(file1)
   copy line into file3
   convert r to array and check to see if r[0] is "rserver"
   if r[0]=="rserver" then:
      for j in range(m):
         k = readline(file2)
         convert k to array and check to see if k[0] is "rserver"
         if k[0]=="rserver" then:
            merge required number of lines from file2 into file3
            increment j by x
close all files

希望这有帮助!