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