我正在阅读的文本文件,并根据某些条件修改特定行并将文件重写为新文本文件。我现在的代码大部分都有效,但是elif
语句之一似乎被Python忽略了,因为没有运行时错误。 MWE如下:
energy = .1
source = str('source x y z energy=%f' %energy)
c = energy - 0.001
c_string = str("1010 %f %f" %(c, energy))
f = open("file.txt", "r+")
with open ("newfiletxti", 'w') as n:
d = f.readlines()
for line in d:
if not line.startswith("source"):
if not line.startswith("xyz"):
n.write(line)
elif line.startswith("source"):
n.write(source + "\n")
elif line.startswith("xyz"):
n.write(c_string + "\n")
n.truncate()
n.close()
代码:
elif line.startswith("source"):
n.write(source + "\n")
按预期工作,文本文件中的行替换为标题为" source"的字符串。然而下一个块:
elif line.startswith("xyz"):
n.write(c_string + "\n")
无效。新的文本文件只是缺少以xyz开头的行。我的猜测是我的多个elif
语句的语法不正确,但我不确定为什么。
答案 0 :(得分:2)
像这样试试你的if
块:
if line.startswith("source"):
n.write(source + "\n")
elif line.startswith("xyz"):
n.write(c_string + "\n")
else:
n.write(line)
答案 1 :(得分:0)
永远不会到达第三个elif。为清晰起见,下面是代码:
if not line.startswith("source"):
# suff
elif line.startswith("xyz"):
# stuff
以“xyz”开头的东西不以“source”开头。
答案 2 :(得分:0)
第一个if
和elif
处理所有情况 - 该行以source
开头,或者不是。我认为您需要将第一个if
及其嵌套if
合并为一个条件:
if not line.startswith("source") and not line.startswith("xyz"):
n.write(line)
或等价的(de Morgan's Laws):
if not(line.startswith("source") or line.startswith("xyz")):
n.write(line)
或者您可以通过重新排序条件来更清楚地说明:
if line.startswith("source"):
n.write(source + "\n")
elif line.startswith("xyz"):
n.write(c_string + "\n")
else:
n.write(line)