Python 将带有附加信息的数据附加到文件中的文本

Python 将带有附加信息的数据附加到文件中的文本,python,Python,我有一个包含数千行代码的文本文件,我想替换某些元素,如下所示: 文件1中的文本: serverfarm host foobar2:443 failaction reassign probe tcp111-probe rserver foobar1 443 rserver foobar2 443 包含我希望附加到原始文件文本(文件2)的附加信息的文本: 因此,我们可以看到,在原始文件中,rserver行没有捕获IP地址,但我在另一个文件中有此信息 之前: rserver foob

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

文件1中的文本:

serverfarm host foobar2:443
  failaction reassign
  probe tcp111-probe
  rserver foobar1 443
  rserver foobar2 443
包含我希望附加到原始文件文本(文件2)的附加信息的文本:

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

之前:

rserver foobar1 443
之后(期望输出)


rserver foobar1 443
我们的想法是编写一个自定义解析器/转换器,如下所示:

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)


其想法是编写一个自定义解析器/转换器,如下所示:

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)


如果您运行的是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

希望这有帮助

如果您运行的是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

希望这有帮助

是的,您可以使用字典或从第二个文件映射服务器名称及其详细信息列表(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:


是的,您可以使用字典或从第二个文件映射服务器名称及其详细信息列表(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:


不同意你的复杂性评估,我的方法的复杂性是O(n)不同意你的复杂性评估,我的方法的复杂性是O(n)
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