基于关键字搜索替换文件中的行,逐行替换另一个文件

时间:2016-01-07 13:33:45

标签: python python-2.7

这是我的文件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。这似乎更容易,但很难弄明白。

1 个答案:

答案 0 :(得分:1)

假设格式始终相同,

Regular expressions将轻松地执行您想要的操作。这就是每一行都有格式"元素N,更多东西",其中

  • "元素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; (依此类推)在第二个文件中,并将其替换为第一个文件中的匹配项。