【问题标题】:Overwriting a few lines in a file only if specific criteria are met仅在满足特定条件时才覆盖文件中的几行
【发布时间】:2013-08-13 12:00:38
【问题描述】:

我有 2 个文件名为:

inp1:

recev: Na Sod B 1    
                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 
                accept: F Fluorin B 82          R-A = 91.00
                        Mn Mangan C 23          R-A = 12.30
...(100+ lines)

inp2:

recev: Na Sod B 1   H-atom: H Hydrogen D 2  
recev: Mg Mag C 3   H-atom: H Hydrogen N 3  
...(100+lines)

现在,我试图用inp2 文件中的行替换inp1 中的recev 行,并放置像if len(lines) == 5 : (then replace) 这样的搜索条件。但请就如何有效替换维护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中的条目顺序相同?您是否需要担心inp2 中的条目在inp1 中不匹配?是否只有recev: 行会被更改?大概,您正在寻找标准输出上的修改数据,并且会让其他代码担心覆盖文件?总是inp2 中条目的前五个字段必须与inp1 中的条目匹配,还是基于少于5 个字段的匹配?为什么Cl chlorine 行的格式不正确(氯的小写 c;与其他行相比,R-A=24.21 周围的间距奇数)?
  • 耶!到目前为止,我已经生成了将在“inp2”中以与“inp1”中相同的顺序提供所有数据的代码。是的,我只想更改“recev:”行,这就是我尝试使用“if 循环”的原因。

标签: python string-formatting file-handling


【解决方案1】:

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

 #!/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

【讨论】:

  • @abhisek 我认为可能是因为文件格式。我的建议是请尝试使用您在问题部分中提到的文件的示例(假设您已经尝试过实际文件)这将很容易调试,也可以尝试打印 dict1 对象并查看其内容,还请验证拆分字符串(例如 ' '我用了三个空格,如果你的文件格式是不同的,可以是不同的。)
  • 尝试在 inp2 中打印 l: print l.spilt(' ') #three spaces 输出应该是什么 >>>{'recev: Na Sod B 1' : 'H-atom: H 氢 D 2\n'} 以此类推....
  • 谢谢你.. 但数据与我的文件中的数据相同,尽管我在执行时遇到 IndexError.. @nikhil
  • 该行是“dict1 = ....”,显示“列表索引超出范围”..我在想“尝试:...除了:”循环是否有帮助..@尼基尔
  • 是的,除了尝试,回溯会给出一些清晰的结果,但我认为拆分是问题l.spilt(' ')[0] or value = l.spilt (' ')[1] 给出错误注释 dict理解我使用的是 dict1=.... 行并使用手动更新到 dict dict1 = {} for l in inp2: key = l.spilt(' ')[0] value = l.spilt (' ')[1] dict1.update({key:value})
【解决方案2】:

不确定我是否正确理解了您的问题,但据我了解,您必须执行以下操作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2014-05-01
    • 2013-02-21
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多