这是我的文件1:
agadfad
sdffasdf
元素1,0,0,0 PCOM
要素2
这是我的文件2:
PBAR
元素1,100,200,300,400
要素2
继续......
我想在file1中使用关键字“元素1”进行搜索,如果找到则存储整行;然后在file2中搜索,如果在某行找到,则将其替换为file1中的数据,在本例中为“Element 1,0,0,0”。同样,如果有更多的关键字,如“元素2,元素3等......”,并且文件非常大,它应该做同样的事情(但这部分后来出现)。我尝试了以下代码:
index1 = 0
index2 = 0
path1 = "C:\Users\sony\Desktop\BDF1.TXT"
path2 = "C:\Users\sony\Desktop\BDF2.TXT"
Target = 'Element 1'
with open(path1) as f1:
list1 = f1.readlines()
for line in list1:
index1 = index1 + 1
if Target in line:
print "Match Found at line %d" %(index)
else:
print "No Match Found in the target file!"
with open(path2, "r+") as f2:
list2 = f2.readlines()
for line2 in list2:
index2 = index2 + 1
if Target in line2:
list2[index2] = line + ' \n'
else:
print "No match found in the targetorg file!"
f2.writelines(list2)
我得到一些看起来像这样的输出:
PBAR
元素1,100,200,300,400
要素2
继续... PBAR
元素1,100,200,300,400
agadfad
继续......
我在第20行的某个地方也遇到错误list assignment index out of range
。这似乎更容易,但很难弄明白。
答案 0 :(得分:1)
Regular expressions将轻松地执行您想要的操作。这就是每一行都有格式"元素N,更多东西",其中
<强>代码强>
import re
with open(path1) as f1, open(path2) as f2:
dat1 = f1.read()
dat2 = f2.read()
matches = re.findall('^Element [0-9]+,[0-9, ]+', dat1, flags=re.MULTILINE)
for match in matches:
dat2 = re.sub('^{},[0-9, ]+'.format(match.split(',')[0]), match, dat2, flags=re.MULTILINE)
with open('changed.txt', 'w') as f:
f.write(dat2)
<强>解释强>
模式"^Element [0-9]+,[0-9, ]+"
从一行开始(因为^),并匹配字符串Element,后跟一个空格,后跟任意长度的数字([0-9] +),然后用逗号表示,后跟任意长度的数字,逗号和空格的组合([0-9,] +)。将有效地找到&#34;元素1,0,0,0&#34;,&#34;元素2,123,123,123,123,123和#34; (例如)等等。
然后你遍历这些匹配,搜索匹配&#34;元素1,[0-9,] +&#34; (依此类推)在第二个文件中,并将其替换为第一个文件中的匹配项。