Python 仅当满足特定条件时才覆盖文件中的几行

Python 仅当满足特定条件时才覆盖文件中的几行,python,string-formatting,file-handling,Python,String Formatting,File Handling,我有两个文件名为: inp1: inp2: 现在,我试图用inp2文件中的行替换recev行inp1,放置一个搜索条件,如if len(lines)==5:(然后替换)。但请就如何高效地维护inp1文件中的所有格式提出建议 预期结果: recev: Na Sod B 1 H-atom: H Hydrogen D 2 accept: F Fluorin B 91 R-A = 12.44 I Iodin

我有两个文件名为:

inp1: inp2: 现在,我试图用
inp2
文件中的行替换
recev
inp1
,放置一个搜索条件,如
if len(lines)==5:(然后替换)
。但请就如何高效地维护
inp1
文件中的所有格式提出建议

预期结果:

recev: Na Sod B 1  H-atom: H Hydrogen D 2  
             accept: F Fluorin B 91           R-A = 12.44 
                     I Iodin  C 22            R-A = 22.11 
                     Cl chlorine D 21         R-A = 24.21  

recev: Mg Mag C 3  H-atom: H Hydrogen N 3
             accept: F Fluorin B 82          R-A = 91.00
                     Mn Mangan C 23          R-A = 12.30

不确定我是否正确理解了你的问题,但据我所知,你必须做到以下几点:


在字符串列表中保留inp2文件的每一行。在inp1文件中搜索以“recev:”开头的行。每当包含“recev:”的行满足条件“if len(lines)==5”时,用保留列表的第一个元素替换该行。每次在inp1文件中找到“recev:”包含行时,删除列表的第一个元素。

未完全优化,但这应该可以工作

 #!/usr/bin/python
 import re
 with open('inp1') as f1, open('inp2') as f2:
     inp1 = f1.readlines()
     inp2 = f2.readlines()

 dict1 = {l.split('   ')[0] : l.split('   ')[1] for l in inp2}

 for line in inp1:
     line = line.rstrip()
     if re.match('recev:',line):
          if dict1.has_key(line):
              line = ' '.join([line, dict1[line].rstrip()])
     print line #write this line to file

您能否显示所需的结果,以及您尝试过的内容?inp2中的条目是否与inp1中的条目顺序相同?您是否需要担心
inp2
中的条目与
inp1
中的条目不匹配?是否只有
recev:
行将被更改?想必,您正在标准输出上寻找修改后的数据,并且会让其他代码担心覆盖该文件?是否总是
inp2
中条目的前五个字段必须与
inp1
中的条目匹配,还是基于少于5个字段的匹配?为什么
Cl-chloride
行的格式不可靠(chloride的小写字母c;与其他行相比,
R-A=24.21
周围的奇数间隔)?耶!到目前为止,我已经生成了代码,它将以与“inp1”相同的顺序提供“inp2”中的所有数据。是的,我只想更改“recev:”行,这就是为什么我尝试使用“if循环”。@abhisek我认为可能是因为z可能是文件格式。我的建议是,请使用您在问题部分中提到的文件(假设您已经在实际文件上尝试过)来尝试示例,这将很容易调试,还可以尝试打印dict1对象并查看其内容,还请验证拆分字符串(例如,“我使用了三个空格,它可能不同。如果您的文件格式不同。)尝试在inp2:print l.spilt('')#三个空格中打印l。输出应该是一些什么>>>{'recev:Na-Sod B 1':'H-atom:H-Hydrogen D 2\n'}等等…谢谢你。。但数据和我的文件中的数据相同,尽管我在执行时得到了indexer@Nikhilt行是“dict1=…”,显示“列表索引超出范围”。。我在想威尔会“试试:……除了:”我会帮不帮你@nikhilYes try Exception and traceback将提供一些清晰的信息,但我认为拆分是一个问题。
l.spilt(“”)[0]或value=l.spilt(“”)[1]
给出了我使用过的错误注释dict理解,即dict1=。。。。行并使用手动更新来dict
dict1={}在inp2:key=l.spilt(“”)[0]value=l.spilt(“”)[1]dict1.update({key:value})
recev: Na Sod B 1  H-atom: H Hydrogen D 2  
             accept: F Fluorin B 91           R-A = 12.44 
                     I Iodin  C 22            R-A = 22.11 
                     Cl chlorine D 21         R-A = 24.21  

recev: Mg Mag C 3  H-atom: H Hydrogen N 3
             accept: F Fluorin B 82          R-A = 91.00
                     Mn Mangan C 23          R-A = 12.30
 #!/usr/bin/python
 import re
 with open('inp1') as f1, open('inp2') as f2:
     inp1 = f1.readlines()
     inp2 = f2.readlines()

 dict1 = {l.split('   ')[0] : l.split('   ')[1] for l in inp2}

 for line in inp1:
     line = line.rstrip()
     if re.match('recev:',line):
          if dict1.has_key(line):
              line = ' '.join([line, dict1[line].rstrip()])
     print line #write this line to file