Python 仅当满足特定条件时才覆盖文件中的几行
我有两个文件名为: inp1: inp2: 现在,我试图用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
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=。。。。行并使用手动更新来dictdict1={}在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